【问题标题】:Best way to expose a multidimensional array property as public?将多维数组属性公开的最佳方式?
【发布时间】:2018-09-25 05:10:18
【问题描述】:

我需要实现一个多维数组作为公共属性。 我使用锯齿状数组进行初始实现:

public int[][] ArrayProperty
{get; set;}

但是,它给了我一个代码分析错误 - 'CA1819:PropertiesShouldNotReturnArrays'

所以我想将其更改为嵌套列表,例如:

public List<List<int>> ArrayProperty
{get;set;}

但我很确定它会给出另一个代码分析错误,说不嵌套泛型类型。 此外,如果我将其更改为 List,我希望它是只读的,并有一个备份私有字段。

我怎样才能更新我的财产结构以得到最好的实施来满足我的要求?

【问题讨论】:

  • 您希望消费者能够编辑数组吗?
  • 可以,他可以获取和设置数组的值。
  • 嗯,它只是一个变暖,有一个很好的理由为什么会有一个警告,如果你知道更好,你可以禁用它
  • 过去我发现如果使用类型化类的列表/数组而不是多维数组,维护起来会更容易。
  • 建议您不要公开数组的原因是它们是可变的(不像普通的 IEnumerable 集合)和协变的,不像列表。但是,如果您的设计表明您想要公开一个数组数组(这实际上不是一个多维数组),请认真思考“这就是我真正想要做的事情”,如果是这样,请抑制警告并继续执行。

标签: c# arrays .net


【解决方案1】:

.NET Framework 通常通过创建自定义集合类来解决这个问题。这样就可以验证数据,提供自定义方法,并且类型名称可以使代码更易于理解。

class MyCollection : IList<int[]> { ... }

你甚至可以进一步包装int[]

//alterantively add an indexer instead of exposing the array
class MyThing { public int[] MyValues { get; set; } }

class MyCollection : IList<MyThing> { ... }

这可能是很多工作。如果您正在编写一个库供其他人使用,那么这可能是值得的。如果是内部代码,我会选择方便的。您可以稍后更改它,因为您正在控制所有调用者。

【讨论】:

  • 这看起来是维护代码并为暴露的 api 提供长期灵活性的好方法。但是,我的代码的当前范围仅在我的项目之前,因此将使用锯齿状数组本身,因为它感觉更适合我的要求。
【解决方案2】:
1. List<KeyValuePair<string, string>>
2. Dictonary<string, Dictonary<string,string>>

尝试使用以上两个。

【讨论】:

    【解决方案3】:

    “属性不应返回数组。”

    微软文档参考here

    解决办法是实现自定义getter。

    如果您希望允许类的使用者修改属性,以下代码显示了一个合法示例:

    using System;
    using System.Collections.ObjectModel; 
    
    namespace PerformanceLibrary
    {    
        public class Book    
        {        
            private Collection<string> _Pages;         
    
            public Book(string[] pages)        
            {            
                _Pages = new Collection<string>(pages);        
            }         
    
            public Collection<string> Pages        
            {            
                get { return _Pages; }        
            }    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多