0

静的コンストラクターは常に優先され、インスタンス コンストラクターの前に最初に呼び出されることを認識しています。ただし、1 つのインスタンス クラスと 1 つの静的クラスを持つシナリオを考えてみましょう。結果が最初に Base class から、次に static class になるのはなぜですか? 交換呼び出しも確認しました。それに応じて結果が得られます。しかし、他のインスタンスクラスに関係なく、常に静的クラスを最初に呼び出す必要があるという私の考えは間違っていますか? これが私に提起された理由は、そのクラスを含む名前空間がトリガーされると、静的クラスが自動的にロードされることをどこかで見たからです。次に、その静的コンストラクターが最初に起動することを期待します。なぜそれが起こっていないのですか?どなたかわかりやすくわかりやすく説明していただけませんか。

    public class Base
    {
        public Base() { Console.WriteLine(" I am from normal Base constructor"); }
        static Base() { Console.WriteLine("Hey I am from Static Base"); } 
    }
    public static class Base1
    {
        static Base1() { Console.WriteLine("I am from Static Constructor"); }
        public static void StaticMethod() { Console.WriteLine("I am from Static Method");   }            
    }

    static void Main(string[] args)
    {
        Base b = new Base();
        Base1.StaticMethod();
        Console.Read();
    }
4

4 に答える 4

1

保証は 1 つだけです。

クラスの静的コンストラクターは、インスタンス コンストラクターまたはそのクラスの静的メンバーの前に呼び出されます。

この保証は、静的コンストラクターが呼び出される時間については何も言いません。ほとんどの場合、静的クラスが実際に使用されているときに呼び出されますが、それ以前ではありません。

別のクラスのインスタンスを作成する前に静的コンストラクターを実行する必要はありません。

あなたは言う:

そのクラスを含む名前空間がトリガーされると、静的クラスが自動的にロードされることをどこかで見ました。

それは正しくありません。何か誤解していると思います。

MSDN には次のように記載されています。

静的クラスは、クラスを含むプログラムまたは名前空間が読み込まれるときに、.NET Framework 共通言語ランタイム (CLR) によって自動的に読み込まれます。

これがどのように誤解される可能性があるかがわかります。ここでの「クラスのロード」は、そのコンストラクターが実行されるという意味ではありません。これは、CLR が単純に型をロードし、それに対していくつかの検証を実行することを意味します。

于 2013-02-13T13:14:00.403 に答える
1

MSDNによると:

静的コンストラクターは、静的データを初期化するため、または一度だけ実行する必要がある特定のアクションを実行するために使用されます。最初のインスタンスが作成される前、または静的メンバーが参照される前に、自動的に呼び出されます。

したがって、あなたの場合、最初に Base クラスのコンストラクターを呼び出してから、Base1 静的メソッドにアクセスしています。

于 2013-02-13T13:15:09.477 に答える
0

静的コンストラクターは、クラスのインスタンスを作成する前、またはその静的メソッド ( http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx )の 1 つにアクセスする前に呼び出されます。あなたが得ている結果は正しいです。

于 2013-02-13T13:14:18.920 に答える
0

静的コンストラクターは、実際に必要な場合にのみ呼び出されます。それらが必要な場合、クラスの通常のコンストラクターの前に呼び出されることが保証されます。

ただし、すべての静的コンストラクターが、別のクラスの通常のコンストラクターの前に呼び出されるという保証はありません。

それを行うことは不可能であり、使用されていない静的コンストラクターの呼び出しを避けることもできません。プログラムが終了する直前に静的コンストラクターを使用してクラスにアクセスし、その後、何らかの条件が満たされた場合にのみアクセスするようなことができます。明らかに、コードは、静的コンストラクターの呼び出しが必要かどうかを判断するために、事前にピアリングすることができませんでした。したがって、コードがアクセスする前に静的コンストラクターを呼び出す方法はありません。

詳細については、静的コンストラクターに関する Eric Lippert のブログを参照してください。

于 2013-02-13T13:14:53.843 に答える