我有一个类,它是两个固定长度数组的容器以及其他一些成员。我想公开数组的元素以便在类外部进行赋值。
示例是:
using System.Collections.ObjectModel;
class ArrayContainer<T, U>
{
private T[] x;
private U[] y;
// Some other members and constructor
public Collection<T> X
{
get { return new Collection<T>(this.x); }
}
public Collection<U> Y
{
get { return new Collection<U>(this.y); }
}
}
如果我尝试执行instance.X [i] = value,我会收到一个异常,说该集合是只读的。所以我有三个问题:
答案 0 :(得分:3)
回答3: 你的表现肯定是个问题;你每次访问它时都会创建一个新实例。每当一个人写一个for ...循环时,你就会得到每个迭代的新实例。
为什么不公开展示您的收藏品?我可以通过简单地使用List来完成同样的事情:
class Data<T,U> {
public List<T> X = new List<T>();
public List<U> Y = new List<U>();
}
编写代码非常简单:
Data<int, string> theData = new Data<int, string>();
// add
theData.X.Add(37);
theData.Y.Add("foo");
// access
theData.X[0] = 42;
theData.Y[0] = "bar";
// as an array
int[] x = theData.X.ToArray();
如果性能真的让你感到沮丧,只需使用数组而不是List&lt; T&gt;。
答案 1 :(得分:3)
不确定,但既然您要返回一个新的集合,那么您对它做了什么并不重要。垃圾收集器删除集合后,更改将丢失。对集合所做的更改不会影响原始数组。
不,正确的方法是直接暴露数组,或者,如果您担心客户端不会玩得很好,请通过getter和setter公开它们。由于C#只允许每个带有参数的类有1个属性,因此你必须使用函数:
instance.SetX(int index, T value);
T val = instance.GetX(int index);
是的,制作副本总是需要额外的时间和内存。如果这是性能关键代码,则此解决方案是不可接受的,否则,它可能没问题。
答案 2 :(得分:0)
如果您熟悉接口的概念,那么您可以选择或编写接口来解释外部应该是什么。然后为您的类声明添加接口,编译器将帮助您正确完成其余的事情。
答案 3 :(得分:0)
我不知道这是为了什么,但为什么不使用索引器或getter / setter方法呢?我认为这是典型的做法。