2016-08-08 3 views
2

私はこれらの2つのクラスがあるとします。静的コレクションは、別のクラスが使用する前に初期化/移入されることが保証されていますか?

public class A<T> where T : IEntityWithID, new() 
{ 
    private static EntityInfo entityInfo = B.GetEntityInfo(typeof(T)); 

    private static IEnumerable TestCases 
    { 
     // Do work with entityInfo... 
    } 
} 

private static class B 
{ 
    private static IList<EntityInfo> entityInfoList = B.GetEntityList(); 

    public static EntityInfo GetEntityInfo(Type type) 
    { 
     return entityInfoList.Single(e => e.Types.Contains(type)); 
    } 

    private static IList<EntityInfo> GetEntityList() 
    { 
     // Builds a list of EntityInfo's... 
    } 
} 

は(クラスBでentityInfoListがB.GetEntityInfo前に初期化して取り込むことが保証されている)は、クラスAに呼ばれているのですか?

+0

'B.GetEntityInfo()'はどこですか?あなたはそれを表示しません。 – itsme86

+0

B.GetEntityInfo()定義を追加... – Andrew

+0

'GetEntityList'はどのようにビルドされていますか? –

答えて

5

はい、これは保証されています。 MSDNのスニペットです:

プログラムは、クラスがロードされたときを正確に指定することはできません。ただし、 がロードされ、フィールドが初期化され、 静的コンストラクターが呼び出されてから、クラスがプログラムで初めて のために参照されることが保証されています。

EDIT:指摘したように、あなたは2つの静的クラスがトラブルにあなたを得ることができ、初期化のために互いに依存する状況に終わる可能性が、限り、それはケースではありませんように、あなたはいいですよ。

+0

ありがとう、これは私が探していたものです。 – Andrew

+0

これは誤りです。実際には、イニシャライザが終了する前に、そのようなフィールドの値を取得することは可能です。 – Servy

+0

彼は実際に* finished *について尋ねたことはありません。あなたの答えは、初期化され、人口が集まっていることを示していますが、(それが起こった後に)それを上書きする機会があります。 –

4

いいえ、循環依存関係がある場合、そのクラスの静的初期化が完了する前にクラスからコードを実行することができます。

はここ5に初期化静的フィールドの簡単な例だし、まだ外部クラスはフィールドがnullされていることを観察する:

public class A 
{ 
    public static void Foo() 
    { 
     Console.WriteLine(B.bar == null); 
    } 
} 

public class B 
{ 
    public static readonly object bar = Foo(); 

    public static object Foo() 
    { 
     A.Foo(); 
     return 5; 
    } 
} 

private static void Main(string[] args) 
{ 
    var bar = B.bar; 
} 

これはtrueを印刷します。

+0

これは心に留めておくのが良い(下降してはならない)が、質問に直接答えない。おそらくそれが追加情報であることを説明する編集でしょうか? –

+2

@KeithPayneそれはどうして*質問に答えないのですか?指定されたメソッドが呼び出される前に値が設定されていることが保証されているかどうかを問い合わせます。メソッドを呼び出すときに、そのメソッドを実装しないようにする方法を示し、保証ができないことを証明しました。 – Servy

+1

私はあなたが何を意味するかを見ます。私はあなたの答えを完全に理解していませんでした。しかしそれはまだ100%オンポイントではないようです。問題のコードに循環依存性は含まれていません。しかし、要約すると、それは有効な懸案事項です。 –

関連する問題