これらのコード ブロックは両方とも同じことを行いますか?
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
}
彼らは同じことをしますか?そう思います。
これらのコード ブロックは両方とも同じことを行いますか?
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
}
彼らは同じことをしますか?そう思います。
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
同一のメソッド/フィールド定義を使用。
C# in a Nutshell によると、最初にプロパティを使用するときに静的コンストラクターが実行されます。これを最も使用するのは、データを計算または読み取り、静的プロパティに設定する場合です(appconfig.config のパスワードのように)。 . 静的コンストラクターを使用しない場合は、Init メソッドを定義し、アプリケーションの開始時に呼び出す必要があります。