Rya*_*che 5 c# static-constructor
鉴于以下代码,为什么在"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" );
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您的问题由规范的第10.12节回答,其中规定:
静态构造函数的执行由应用程序域中发生的以下第一个事件触发:
•创建类类型的实例.
•引用类类型的任何静态成员.
既然你没有完成这两件事,那么ctor就不会被执行.
对于嵌套类,如果嵌套类从不引用它的外部作用域的静态成员,则编译器(和CLR)不需要调用该外部类的静态构造函数.
如果要强制运行静态构造函数,只需将代码添加到执行外部类型的字段或属性读取的内部类型中.
您可以在Jon Skeet的博客上阅读有关C#的延迟初始化语义的更多信息- 这非常好.您还可以查看他的书 - C#In Depth,它也涵盖了这些主题......深入.