如果你看看.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)。
答案 0 :(得分:1)
那是因为否则,每个Stack
都会获得自己的new T[0]
实例。现在他们都引用了同一个实例:声明为static的实例。假设您声明1000 Stack<string>
。这些都引用了一个string[0]
对象。如果在构造函数中声明了空数组,则会有1000个string[0]
个实例,每个Stack<string>
一个实例。所以这是出于性能原因。
其他初始值设定项是不必要的,但如果您通过其他源文件查看Reflector,您会看到相同的模式:具有默认值的字段在构造函数中被赋予显式值。