6

次のコードの場合、"Main" の最初の行の後に "Outer" の静的コンストラクターが呼び出されないのはなぜですか?

namespace StaticTester
{
    class Program
    {
        static void Main( string[] args )
        {
            Outer.Inner.Go();
            Console.WriteLine();

            Outer.Go();

            Console.ReadLine();
        }
    }

    public static partial class Outer
    {
        static Outer()
        {
            Console.Write( "In Outer's static constructor\n" );
        }

        public static void Go()
        {
            Console.Write( "Outer Go\n" );
        }

        public static class Inner
        {
            static Inner()
            {
                Console.Write( "In Inner's static constructor\n" );
            }

            public static void Go()
            {
                Console.Write( "Inner Go\n" );
            }
        }
    }
}
4

4 に答える 4

7

あなたの質問は、仕様のセクション 10.12 で回答されています。

静的コンストラクターの実行は、アプリケーション ドメイン内で次のイベントの最初の発生によってトリガーされます。

• クラス タイプのインスタンスが作成されます。

• クラス型の静的メンバーのいずれかが参照されている。

これら 2 つのことのどちらも行っていないため、ctor は実行されません。

于 2010-04-13T14:20:07.500 に答える
5

入れ子になったクラスの場合、入れ子になったクラスがその外側のスコープの静的メンバーを参照しない場合、コンパイラ (および CLR) はその外側のクラスの静的コンストラクターを呼び出す必要はありません。

静的コンストラクターを強制的に実行する場合は、外側の型のフィールドまたはプロパティの読み取りを実行するコードを内側の型に追加するだけです。

Jon Skeet のブログで、C# の遅延初期化セマンティクスについて詳しく読むことができます。これは非常に優れています。また、彼の著書C# In Depthも参照してください。これらのトピックについても詳しく説明しています。

于 2010-04-13T13:17:25.720 に答える
3

Outer.Inner は型を参照しているだけで、実際には「Outer」で何かを呼び出しているわけではありません。

于 2010-04-13T13:00:54.350 に答える
0

静的初期化子は、含まれているクラスが初めて使用されるときにのみ実行されます。

を呼び出すことにより、はとは異なるタイプであるため、Outer.Innerまったく使用Outerしていません。そのため、の静的初期化子は実行されません。Outer.InnerOuterOuter

于 2010-04-13T13:09:26.213 に答える