早上好,
假设我有一个班级
public class Class
{
int something;
int[] otherThing;
}
我希望使Class
类型的对象成为不可变的。还假设我有一个非常频繁的操作,它创建了一个Class
,
public Class SomeFunction()
{
int[] Temp = new int[] { ... };
return new Class(1, Temp);
}
为了避免过于频繁地创建新对象,并且由于Temp
不再可以从方法中访问,因此在构造函数上设置是否太糟糕
this.otherThing = Temp;
而不是
otherThing = new uint[Temp.Length];
for (int i = 0; i < Temp.Length; i++)
{
this.otherThing[i] = Temp[i];
}
非常感谢。
答案 0 :(得分:3)
如果执行此操作的构造函数是私有的,那么它的精细IMO。既然你知道其他数组的内容永远不会改变,你可以直接使用它。如果你想在不引起任何问题的情况下,你甚至可以在你的类的几个实例之间共享一个数组实例。
另一方面,直接使用提供的数组的公共构造函数是个坏主意。因为那可以用来打破不变性。
答案 1 :(得分:2)
最好将temp
的副本分配给otherThing
,以便otherThing
的所有更改都不会更改temp
。您也可以使用Array.CopyTo
方法实现此目的。
此外,您应该认真考虑使用IEnumerable<int>
或IList<int>
而不是int[]
,因为数组本质上违背了不变性的概念。 Read this blog post by Eric Lippert
答案 2 :(得分:0)
不同之处在于,在第一个选项中,您始终会获得一个新实例;在第二个选项中,所有创建的“Class”es将指向同一个数组(!)。因此,如果您在任何类中更改数组中的某些内容,则会更改所有其他类。