首先,先看一张结论表
If(有类显式静态构造函数)
{
If(有访问静态成员)
{
在进入Main函数之后,第一次访问静态成员之前,先调用静态构造函数,以后将不再调用静态构造函数,同一个静态构造函数最多只能调用一次。
}
Else
{
不调用该类静态构造函数
}
}
Else
{
If(有访问静态成员)
{
在执行Main函数中的代码之前,先调用静态构造函数,以后将不再调用静态构造函数,同一个静态构造函数最多只能调用一次。
}
Else
{
不调用该类静态构造函数
}
}
{
If(有访问静态成员)
{
在进入Main函数之后,第一次访问静态成员之前,先调用静态构造函数,以后将不再调用静态构造函数,同一个静态构造函数最多只能调用一次。
}
Else
{
不调用该类静态构造函数
}
}
Else
{
If(有访问静态成员)
{
在执行Main函数中的代码之前,先调用静态构造函数,以后将不再调用静态构造函数,同一个静态构造函数最多只能调用一次。
}
Else
{
不调用该类静态构造函数
}
}
1.下面先来验证一下上面的结论
public class Class_1 { public static int i; static Class_1() //显式定义静态构造函数 { Console.WriteLine("Class_1:显示定义了静态构造函数"); i = 1; } } public class Class_2 { public static int i = Init(2); //没有显式定义静态构造函数 public static int Init(int j) { Console.WriteLine("Class_2:没有显示定义了静态构造函数"); return j; } } public class MainClass { static void Main() { //分别分析以下几种情况的结果 } }
1. 显示定义了静态构造函数,且有访问静态成员
static void Main()
{
///1.显示定义静态构造函数 2.有访问Class_1中的静态成员i
Console.WriteLine("Start In Main:");
Console.WriteLine(Class_1.i);
}
结果如下:
Start In Main:
Class_1:显示定义了静态构造函数
1
static void Main()
{
///1.显示定义静态构造函数 2.有访问Class_1中的静态成员i
Console.WriteLine("Start In Main:");
Console.WriteLine(Class_1.i);
}
结果如下:
Start In Main:
Class_1:显示定义了静态构造函数
1
2. 显示定义了静态构造函数,且没有访问静态成员
static void Main()
{
///1.显示定义静态构造函数 2.没有访问Class_1中的静态成员i
Console.WriteLine("Start In Main:");
}
结果如下:
Start In Main:
static void Main()
{
///1.显示定义静态构造函数 2.没有访问Class_1中的静态成员i
Console.WriteLine("Start In Main:");
}
结果如下:
Start In Main:
3. 没有显示定义了静态构造函数,且有访问静态成员
static void Main()
{
///1.没有显示定义静态构造函数 2.有访问Class_2中的静态成员i
Console.WriteLine("Start In Main:");
Console.WriteLine(Class_2.i);
}
结果如下:
Class_2:没有显示定义了静态构造函数
Start In Main:
2
static void Main()
{
///1.没有显示定义静态构造函数 2.有访问Class_2中的静态成员i
Console.WriteLine("Start In Main:");
Console.WriteLine(Class_2.i);
}
结果如下:
Class_2:没有显示定义了静态构造函数
Start In Main:
2
4.没有显示定义静态构造函数,且没有访问静态成员
static void Main()
{
///1.没有显示定义静态构造函数 2.没有访问Class_2中的静态成员
Console.WriteLine("Start In Main:");
}
结果如下:
Start In Main:
static void Main()
{
///1.没有显示定义静态构造函数 2.没有访问Class_2中的静态成员
Console.WriteLine("Start In Main:");
}
结果如下:
Start In Main:
参考资料:
1.关于Type Initializer和 BeforeFieldInit的问题,看看大家能否给出正确的解释(http://www.cnblogs.com/artech/archive/2008/11/01/1324280.html)
2.通过七个关键编程技巧得益于静态内容(http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/us0501StaticsinNET.mspx?mfr=true)
3.静态构造函数的执行时机(http://www.cnblogs.com/happyhippy/archive/2007/04/04/710936.html)
4.品味细节,深入.NET的类型构造器(http://www.cnblogs.com/anytao/archive/2008/11/02/must_net_23.html)