4

これらのコード ブロックは両方とも同じことを行いますか?

class A {
   public static int s;
   A(){}
   static A(){s = 100;}
}

class A {
   public static int s=100;
   A(){}
   //static A(){s = 100;} do not use
}

彼らは同じことをしますか?そう思います。

4

4 に答える 4

3

beforefieldinit動作などのいくつかのエッジ ケースを除いて、はい、同じことを行います。実際、コンパイルされた IL は 2 つのケースでほぼ同じです。唯一の違いは、beforefieldinit静的コンストラクターのないものに存在することです。

class A
{
    public static int s;
    A() { }
    static A() { s = 100; }
}

class B
{
    public static int s = 100;
    B() { }
}

コンパイルすると...

.class private auto ansi A
    extends [mscorlib]System.Object

.class private auto ansi beforefieldinit B
    extends [mscorlib]System.Object

同一のメソッド/フィールド定義を使用。

于 2014-09-30T16:37:26.073 に答える
0

C# in a Nutshell によると、最初にプロパティを使用するときに静的コンストラクターが実行されます。これを最も使用するのは、データを計算または読み取り、静的プロパティに設定する場合です(appconfig.config のパスワードのように)。 . 静的コンストラクターを使用しない場合は、Init メソッドを定義し、アプリケーションの開始時に呼び出す必要があります。

于 2014-09-30T16:47:13.497 に答える