我在一个类中有两个私有数组,它使用一个方法运行某个操作。调用此方法后,这两个数组将填充结果。制作这些数组属性并不是一个好习惯,所以我计划有一个单独的属性来返回私有数组的克隆。
1)返回数组克隆的开销是多少?在每种情况下都不明显吗?
2)如果只有一个数组,我可以使用索引器。是否有一种特定的机制可以为类中的多个数组使用索引器?
答案 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 */ } }