2012-01-23 12 views
3

静的リストプロパティを持つ静的クラスがあります。リストのコンテンツを一度だけ生成し、それを使用できるようにしたい。もちろん、データが実際に作成されていることを確認して、オブジェクトがクラスを使用するときにリストにデータがあるようにしたいとします。これをどのように達成するのですか?静的クラスのデータが生成され、一度だけ生成されるようにするにはどうすればよいですか?

public static class MyClass 
{ 
    public static List<int> MyList = new List<int>(); 

    public MyClass() 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      MyList.Add(i); 
     } 
    } 
} 

答えて

6
  • 私はまた、あなたの現在のコードはまさにそれを保証

データが実際に作成されていることを確認したい一度だけ

  • リストの内容を生成したいですコンストラクタを静的に変更すると、次のようになります。

    static MyClass() { } // not public or private 
    

    クラスローダは、クラスの他のメンバを実行する前に、MyListの初期化を実行します。これは、クラスが初めて使用されたときに発生します。

    静的メンバーは、アプリケーションの開始時に初期化されます(1回だけ)。

    スタティックイニシャライザが互いに依存しているものをビルドするときにのみ、あなたは何か考えている/気になるかもしれません。静的コンストラクタは必要ありません。またあなたはアクセサメソッドを使用することができるなどpublic

  • +1

    しかし、私はクラスを参照するたびに、コンストラクタは再びそれですべてのコードを実行していないのだろうか? – Bildsoe

    +1

    私はそのコードに誤りがあると信じています。静的クラスはインスタンスコンストラクタを持つことはできません。 –

    +0

    私は最初、あなたのctorがインスタンスctorであり、静的クラスでは許可されていないという事実を見落としました。静的なctorだけで十分です。 –

    5

    あなたはこのようなことのためにstatic constructorを、使用する必要がありますリストが初期化され、データで満たされているかどうかをトラッキングする変数boolがリストに含まれています。

    ような何か:

    private static List<int> myList; 
    
    private static void doInitializeList() { 
        myList = new List<int>(); 
        // fill list here 
    } 
    
    public static List<int> getMyList() { 
        if (!_myListInitialized) { 
         doInitializeList(); 
        } 
        return myList; 
    } 
    
    0

    のような任意のスコープ修飾子を受け入れないことを

    static MyClass() 
    { 
        for (int i = 0; i < 10; i++) 
        { 
         MyList.Add(i); 
        } 
    } 
    

    注:

    関連する問題