这是不可变性的好习惯吗?

时间:2011-03-07 10:38:47

标签: c# immutability

早上好,

假设我有一个班级

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];
}

非常感谢。

3 个答案:

答案 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将指向同一个数组(!)。因此,如果您在任何类中更改数组中的某些内容,则会更改所有其他类。