.NET:定数がアクセスしている場合、静的コンストラクターは呼び出されますか?

StackOverflow https://stackoverflow.com/questions/6316738

  •  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がロードされたときに静的コンストラクターが呼び出されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top