.NET:定数がアクセスしている場合、静的コンストラクターは呼び出されますか?
-
26-10-2019 - |
質問
だからここに私が考えていることがあります...
public class MyClass
{
public const string MyConstant = "MyConstantValue";
private static MyClass DefaultInstance;
static MyClass()
{
DefaultInstance = new MyClass();
}
}
...
NotificationService.RegisterForNotification(MyClass.MyConstant, Callback);
これは機能しますか、それとも私はのようなものを使用する必要がありますか static readonly
財産 静的コンストラクターをトリガーするフィールド?
解決
定数を使用すると、静的コンストラクターが呼び出されるメンバーアクセスが必ずしもアクセスできません。コンパイラは、コンパイル時に定数の値を置き換えることが許可されています。
あなたの提案された回避策 static readonly
ただし、大丈夫ですが readonly
プロパティではなく、フィールドを提案します。プロパティは、セッターがない場合、読み取り専用です。 readonly
キーワードは関係ありません。
簡単な例:
class HasSConstructor
{
internal const int Answer = 42;
static HasSConstructor()
{
System.Console.WriteLine("static constructor running");
}
}
public class Program
{
public static void Main()
{
System.Console.WriteLine("The answer is " + HasSConstructor.Answer.ToString());
}
}
.NET 4.0での出力:
答えは42です
静的コンストラクターは決して実行されません!
他のヒント
静的コンストラクターは、最初のインスタンスが作成されるか、静的メンバーが参照される前に自動的に呼び出されます。ここを参照してください: MSDN:静的コンストラクター
ちなみに、一定のフィールドは本質的に静的ですが、指摘されているように、彼らは値自体に置き換える可能性があります(そしておそらくそうなるでしょう)。
パブリック定数にアクセスするだけで、静的コンストラクターは呼び出されません。たとえば、このクラスを考えてみましょう。
class Testo
{
public const string MyValue = "Hello, world";
public static readonly int xyzzy;
static Testo()
{
Console.WriteLine("In static constructor");
xyzzy = 27;
}
}
さて、別のクラスで、実行してください。
Console.WriteLine(Testo.MyValue);
Console.WriteLine(Testo.xyzzy);
出力は次のとおりです。
Hello, world
In static constructor
27
定数は、コンパイル時にクラスから巻き上げられます。したがって、の価値 Testo.MyValue
参照しません Testo
実行時のクラス。静的コンストラクターは、初期化が必要なものを呼び出すまで呼び出されません。
だから、はい、あなたは次のようなものにアクセスする必要があります static readonly
コンストラクターが呼び出されていることを確認したい場合。
いいえ、そのようなものは必要ありません。 Classがロードされたときに静的コンストラクターが呼び出されます。