5

これが私が考えていることです...

public class MyClass
{
    public const string MyConstant = "MyConstantValue";

    private static MyClass DefaultInstance;

    static MyClass()
    {
         DefaultInstance = new MyClass();
    }
}

...

NotificationService.RegisterForNotification(MyClass.MyConstant, Callback);

これは機能しますか、それとも次のようなものを使用する必要がありますかstatic readonly 財産静的コンストラクターをトリガーするフィールド?

4

4 に答える 4

4

定数を使用しても、必ずしもメンバーアクセスが発生するとは限らず、静的コンストラクターが呼び出されます。コンパイラーは、コンパイル時に定数の値を置き換えることができます(推奨されます)。

プロパティではなくフィールドを提案しますが、提案された回避策は問題あり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です

静的コンストラクターは実行されません!

于 2011-06-11T16:07:35.533 に答える
3

静的コンストラクターは、最初のインスタンスが作成される前、または静的メンバーが参照される前に自動的に呼び出されます。ここを参照してください:MSDN:静的コンストラクター

ちなみに、定数フィールドは本質的に静的ですが、指摘されているように、値自体に置き換えられる可能性があります(おそらくそうなるでしょう)。

于 2011-06-11T15:27:10.450 に答える
1

パブリック定数にアクセスしているだけの場合、静的コンストラクターは呼び出されません。たとえば、次のクラスについて考えてみます。

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コンストラクターが呼び出されるようにする場合は、のようなものにアクセスする必要があります。

于 2011-06-11T16:08:04.863 に答える
-1

いいえ、そのようなものは必要ありません。静的コンストラクターは、クラスがロードされるときに呼び出されます。

于 2011-06-11T15:26:27.173 に答える