2011-09-16 14 views
4
私は次のコードに興味取得してい

:次のコードが実行されるときに、私は静的クラスContainerが初期化されます理解しましたようジェネリック静的フィールドの初期化

public static class Container<T> 
{ 
    public static readonly T[] EmptyArray = new T[0]; 
} 

... 
var emptyArray = Container<int>.EmptyArray; 
... 

私は正しい?静的なジェネリッククラス/メンバの初期化についての説明は理解できます。前もって感謝します。

+0

はい、正解です –

答えて

7

静的フィールドは、アクセスする前に初期化されるという保証があります。静的コンストラクターが存在する場合は、静的コンストラクターが実行される前にすべての静的フィールドが初期化されます。

ジェネリッククラスの場合、静的初期化は型ごとに行われるため、Container<int>Container<double>とはまったく異なるクラスです。これは、ジェネリッククラスのすべての静的部分について実際に当てはまります。各タイプは独自の「コピー」を取得します。

の例では、より明確に、この最後の点が表示されます:

static class Foo<T> 
{ 
    static int count = 0; 
    public static int Increment() 
    { 
     return ++count; 
    } 
} 

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine(Foo<int>.Increment()); 
     Console.WriteLine(Foo<int>.Increment()); 
     Console.WriteLine(Foo<double>.Increment()); 
    } 
} 

出力:

1 
2 
1 
+1

答えが "はい"です – porges

3

静的フィールド初期化子が本当にクラスの静的コンストラクタ(タイプ初期化子)に移動されます。だからあなたのコードは、この自動的にコンパイル:

がそれ[静的コンストラクタ]最初のインスタンスが作成される前に自動的に呼び出されるか、いずれかの静的メンバが参照されます

public static class Container<T> 
{ 
    public static readonly T[] EmptyArray; 

    static Container() 
    { 
     EmptyArray = new T[]; 
    } 
} 

静的コンストラクタについてMSDNから。

Container<string>

Container<bool>が同じではないので、静的コンストラクタはTの種類ごとに一度呼び出されます。

+0

私は静的なコンストラクタのアイデアを誤解しています - プログラムの開始時に静的なコンストラクタが呼び出されたと思いますので、このコードサンプルはかなり奇妙に見えました。ありがとう。 – danyloid

+0

@danyloid:ランタイムは、クラスのメンバーが使用される前にいつでもスタティックコンストラクターを呼び出すことができます。これは*プログラムの開始時、または実際に初めて使用する直前になる可能性があります。 – porges

+0

@Porgesありがとうございます。 – danyloid

関連する問題