【问题标题】:Arrays as properties and indexers数组作为属性和索引器
【发布时间】:2012-09-28 11:05:26
【问题描述】:

我在一个使用方法运行某个操作的类中有两个私有数组。调用此方法后,将用结果填充这两个数组。制作这些数组属性不是一个好习惯,所以我打算有一个单独的属性来返回私有数组的克隆。

1) 返回数组克隆的开销是多少?是不是在每种情况下都不引人注意?

2) 如果只有一个数组,我可以使用索引器。是否有一种特定的机制可以为一个类中的多个数组使用索引器?

【问题讨论】:

  • 你显示显示代码
  • 你真的需要将这些数组保存在一个类中吗?直接返回填充的数组不是更好吗?
  • 该类评估并包含结果,因此我认为最好将它们保留在类中。否则,我可以只调用方法本身并获取结果。
  • 这与它无关。从调用者的角度考虑它。你期望方法返回一些东西吗?然后从方法中返回它。
  • 方法本身返回了许多变量,这就是为什么我认为将它们包含在一个类中会很好。这样,如果需要将运算结果复制到其他地方,那么我可以只复制实例,而不是复制方法返回的每个变量。

标签: c# arrays properties indexer


【解决方案1】:

也许可以做这样的事情

KeyValuePair this[int i] { get { /* code */ } private set{ /* code */ } }

【讨论】:

  • 我认为这不能很好地代表我的具体情况,但无论如何谢谢。
【解决方案2】:

克隆数组是一种内存分配;影响将直接取决于数组的大小。

索引器只是一种方法;另一种方法可能是仅添加诸如GetName(int index)GetValue(int index) 之类的方法(例如,如果您的数组是名称/值)。唉,C# 中没有内置的命名索引器。

如果性能很重要,并且您需要访问多个值,那么另一种方法是将值复制到调用者提供的数组中,例如GetNames(string[] names, int offset) { this.names.CopyTo(names, offset); }。这可以通过允许调用者分配一个 single 缓冲区,然后使用它从多个对象获取值 - 或者如果您添加一些参数(用于计数等)来获取值,这可能很有用分批而不是单独。不过,这是否必要/有用在很大程度上取决于具体情况。

【讨论】:

    【解决方案3】:

    我认为您的意思是“开销”或“成本”,而不是“超载”。无论如何,计算上它是O(1),所以它取决于数组的大小,但一般来说,如果数组复制少于一千个元素左右,那么它是一种廉价的操作。

    如果您不打算修改数组,则可以通过将私有数组包装在 ReadOnlyCollection<T> 中来公开您的私有数组,如下所示:

    private TWhatever[] _array;
    public ReadOnlyCollection<TWhatever> Elements { get; private set; }
    
    public ClassConstructor() {
        _array = new TWhatever[1000];
        this.Elements = new ReadOnlyCollection<TWhatever>( _array );
    }
    

    【讨论】:

    • 当我们初始化ReadOnlyCollection时,它不会把数组的元素复制到内存的其他地方吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    相关资源
    最近更新 更多