2015-09-11 13 views
7

Jon Skeetのartice C# and beforefieldinitおよびWhen is a static constructor called in C#?での議論によれば、最初にクラスのメソッドを呼び出す前に静的コンストラクターを呼び出す必要があります。この動作を示さないコードを以下のいくつかの理由クラスメソッドへの最初の呼び出しの前に静的コンストラクターが呼び出されない理由

namespace AbstractAndStatic 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      StaticClass.Equals(1,2); 
      StaticClass.foo(); 
     } 
    } 
    static class StaticClass : Object 
    { 
     public static void foo() 
     { 
      Console.WriteLine("Static"); 
     } 
     static StaticClass() 
     { 
      Console.WriteLine("static constructor"); 
     } 
    } 
    class TestClass 
    { 
     public void deb() 
     { 
      Console.WriteLine("Test Class Debug"); 
     } 
    } 
}  

私は、Visual Studioデバッガを使用して上記のコードをデバッグしています。文StaticClass.Equals(1,2);がMainメソッドで実行されると、静的コンストラクタは呼び出されませんが、StaticClass.foo();が実行されると、静的コンストラクタが呼び出され、fooメソッドが呼び出されます。

StaticClass.Equals(1,2);を実行したときになぜ初めて呼び出されなかったのかと少し混乱しています。 StaticClassEqualsに適用可能な過負荷を提供しないよう

+0

私はあなたがObject.Equalsをオーバーライドする必要があると信じています。それが現れて、それはベースバージョンを呼んでいます。すべてのクラスはオブジェクトbtwを継承しているため、手動で行う必要はありません。 –

+0

あなたのEquals()メソッドはどこに書かれていますか? –

+0

@MicrosoftDNが 'Object.Equals'から継承されました –

答えて

12

StaticClass.Equalsへのあなたの呼び出しは、実際にObject.Equals(Object, Object)にだけ呼び出しです。 ILを見ると、コンパイラが呼び出しをただちにObject.Equals(1, 2)に解決したことがわかります。実際に静的クラスを含むメソッドを呼び出さない場合は、初期化する必要はありません。

+0

「初期化する必要はありません」 - フレームワークが静的コンストラクタを先に呼び出すことを決定した場合でも有効な動作です。 –

+2

@AlexeiLevenkov:いいえ、そうではありません。型に静的コンストラクタがある場合、そのクラスのメンバへの最初の参照の前にただ即座に*実行されることが保証されています。あなたは、静的なコンストラクタのない型が初期化された時を考えているかもしれません。これはかなり寛大です。具体的には、C#仕様の「静的コンストラクタの実行は、アプリケーションドメイン内で発生する次のイベントのうちの最初のものによってトリガされます。\tクラス型のインスタンスが作成されます。\tクラス型の静的メンバ参照されます。 –

+0

@AlexeiLevenkov:参照:http://csharpindepth.com/Articles/General/Beforefieldinit.aspx –

関連する問題