4

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

1) 返回数组克隆的开销是多少?在每种情况下都不明显吗?

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

4

3 回答 3

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 );
}
于 2012-10-08T08:10:54.263 回答
2

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

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

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

于 2012-10-08T08:13:14.927 回答
1

也许有可能做这样的事情

KeyValuePair this[int i] { get { /* code */ } private set{ /* code */ } }
于 2012-10-08T08:19:37.847 回答