先看代码:
1.包含静态字段的调用
class Program
{
static void Main(string[] args)
{
Console.WriteLine("EntryPoint");
Console.WriteLine(StaticClass.staticMem);
StaticClass.ShowStaticStr("Call Static Method");
Console.Read();
}
class StaticClass
{
public static string staticMem = ShowStaticStr ("Static Member");
public static string ShowStaticStr(string message)
{
Console.WriteLine(message);
return message;
}
}
}
结果如下:
![](https://img-my.csdn.net/uploads/201205/24/1337843314_6179.jpg)
添加静态构造函数:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("EntryPoint");
Console.WriteLine(StaticClass.staticMem);
StaticClass.ShowStaticStr("Call Static Method");
Console.Read();
}
class StaticClass
{
public static string staticMem = ShowStaticStr("Static Member");
public static string ShowStaticStr(string message)
{
Console.WriteLine(message);
return message;
}
static StaticClass()
{ }
}
结果如下:
2.去掉静态字段调用
static void Main(string[] args)
{
Console.WriteLine("EntryPoint");
// Console.WriteLine(StaticClass.staticMem);
StaticClass.ShowStaticStr("Call Static Method");
Console.Read();
}
class StaticClass
{
public static string staticMem = ShowStaticStr ("Static Member");
public static string ShowStaticStr(string message)
{
Console.WriteLine(message);
return message;
}
}
结果如下:
添加静态构造函数:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("EntryPoint");
//Console.WriteLine(StaticClass.staticMem);
StaticClass.ShowStaticStr("Call Static Method");
Console.Read();
}
class StaticClass
{
public static string staticMem = ShowStaticStr("Static Member");
public static string ShowStaticStr(string message)
{
Console.WriteLine(message);
return message;
}
static StaticClass()
{ }
}
结果如下:
显式定义静态构造函数时的IL:
未显式定义静态构造函数的IL:
未显式定义静态构造函数时,IL中多了一个beforefieldinit标志,此标志使得运行库能够在任何时候执行类型构造函数方法,只要该方法(静态构造函数)在第一次访问该类型的静态字段(而不是方法)之前执行即可。换句话说,beforefieldinit 为运行库提供了一个执行主动优化的许可。如果没有 beforefieldinit,运行库就必须在某个精确时间(调用之前)运行类型构造函数,即,恰好在第一次访问该类型的静态或实例字段和方法之前。当存在显式类型构造函数时,编译器不会用 beforefieldinit 标记该类型,精确的计时限制会导致 FxCop 所暗示的性能下降。
转贴请注明作者和出处。