2

.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)に初期化されます。

4

1 に答える 1

1

それ以外の場合は、すべてStackが独自の。のインスタンスを取得するためnew T[0]です。現在、それらはすべて同じインスタンス、つまり静的と宣言されたインスタンスを参照しています。1000を宣言するとしますStack<string>。これらはすべて、1つのstring[0]オブジェクトへの参照を持っています。コンストラクター内で空の配列を宣言した場合string[0]、各に1つずつ、1000のインスタンスがありますStack<string>。つまり、パフォーマンス上の理由からです。

他の初期化子は不要ですが、他のソースファイルでReflectorを見ると、どこでも同じパターンが見られます。デフォルト値のフィールドには、コンストラクター内で明示的な値が割り当てられます。

于 2010-08-31T08:44:26.863 に答える