为什么我们需要静态私有数组来初始化其他非静态私有数组字段?

时间:2010-08-31 08:41:01

标签: c# constructor field private-members

如果你看看.NET 4.0中的Stack<T>类,你会注意到有一个“emptyArray”私有静态字段,它在构造函数中用来初始化一个真正的“数组”私有字段。

private T[] array;
private static T[] emptyArray;
private int size;
private int version;

static Stack()
{
    Stack<T>.emptyArray = new T[0];
}

public Stack()
{
    array = Stack<T>.emptyArray;
    size = 0;
    version = 0;
}

为什么不放this.array = new T[0];?还有为大小和版本字段放置初始化笔划的原因,如果省略这些行,它们将被初始化为默认值(0)。

1 个答案:

答案 0 :(得分:1)

那是因为否则,每个Stack都会获得自己的new T[0]实例。现在他们都引用了同一个实例:声明为static的实例。假设您声明1000 Stack<string>。这些都引用了一个string[0]对象。如果在构造函数中声明了空数组,则会有1000个string[0]个实例,每个Stack<string>一个实例。所以这是出于性能原因。

其他初始值设定项是不必要的,但如果您通过其他源文件查看Reflector,您会看到相同的模式:具有默认值的字段在构造函数中被赋予显式值。