2

如果您查看Stack<T>.NET 4.0 的内部类,您会注意到有一个“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)。

4

1 回答 1

1

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

其他初始化程序是不必要的,但是如果您通过其他源文件查看 Reflector,您会在任何地方看到相同的模式:具有默认值的字段在构造函数中被分配显式值。

于 2010-08-31T08:44:26.863 回答