数组作为属性和索引器

时间:2012-10-08 08:07:53

标签: c# arrays properties indexer

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

private TWhatever[] _array;
public ReadOnlyCollection<TWhatever> Elements { get; private set; }

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

也许可以做这样的事情

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