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 节回答了您的问题,其中指出:

静态构造函数的执行由在应用程序域中发生的以下第一个事件触发:

• 创建类类型的实例。

• 引用类类型的任何静态成员。

由于您没有完成这两件事,因此不会执行 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.Inner它的类型与Outer. 因此,静态初始化程序Outer将不会运行。

于 2010-04-13T13:09:26.213 回答