鉴于以下代码,为什么在“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" );
}
}
}
}
答案 0 :(得分:6)
您的问题由规范的第10.12节回答,其中指出:
执行静态构造函数 由第一个触发 以下事件发生在一个 应用领域:
•一个实例 类类型已创建。
•任何 类类型的静态成员 被引用。
既然你没有做过这两件事,那么ctor就不会被执行。
答案 1 :(得分:5)
对于嵌套类,如果嵌套类从不引用它的外部作用域的静态成员,则编译器(和CLR)不需要调用该外部类的静态构造函数。
如果要强制运行静态构造函数,只需将代码添加到执行外部类型的字段或属性读取的内部类型中。
你可以在Jon Skeet's blog上阅读更多关于C#的延迟初始化语义 - 它非常好。你也可以查看他的书 - C# In Depth,它也涵盖了这些主题......深入。
答案 2 :(得分:3)
Outer.Inner只是指一个类型,它实际上并没有在“外部”上调用任何东西。
答案 3 :(得分:0)
静态初始化程序仅在首次使用包含类时才会执行。
通过调用Outer.Inner
,您根本不使用Outer
,因为Outer.Inner
与Outer
的类型不同。因此,Outer
中的静态初始化程序将无法运行。