这段代码将静态构造方法做了修改,在方法体内将静态字段 a 进行自增操作。然后在代码的第 17 行又 创建了一个类的实例,然后再次调用类的实例方法。
下面看执行结果:
静态字段 a 的值是:1
静态字段 a 的值是:1
可以看到,静态字段的值并没有增加。这就是静态构造方法执行的特点,它只执行了一次。当程序集 运行的时候,将会创建一个应用程序域,在一个应用程序域中,类的静态构造方法仅仅执行一次。
下面再对代码实例进行修改如下:
using System;
namespace LycheeTest {
class Test {
public static int a;
static Test() {
Console.WriteLine("类的静态构造方法开始执行");
a++;
}
public void Show() {
Console.WriteLine("静态字段 a 的值是:{0}", a);
}
}
class Program {
static void Main(string[] args) {
Console.WriteLine("静态字段 a 的值是:{0}", Test.a);
Console.WriteLine("静态字段 a 的值是:{0}", Test.a);
Console.ReadKey();
}
}
}
这段代码在类的静态构造方法中打印输出了一行标记,类的静态字段的访问权限也修改为 public,这让它可以在类外被调用。在 Main 方法中两次打印输出了静态字段的值,注意在类外调用类的静态字段需要 使用类名进行引用。
下面是代码的执行结果:
类的静态构造方法开始执行
静态字段 a 的值是:1
静态字段 a 的值是:1
本段代码并没有创建类的实例。在引用类的静态成员之前,类的静态构造方法将被调用。这个被调用的类的静态成员包括静态字段和静态方法。这就是类的静态构造方法调用的第二个条件。
下面再对代码实例进行修改如下:
using System;
namespace LycheeTest {
class Program {
private static int a;
static Program() {
Console.WriteLine("类的静态构造方法被调用");
a = 11;
}
static void Main(string[] args) {
Console.WriteLine("Main 方法被调用");
Console.WriteLine("静态字段 a 的值是:{0}", a);
Console.ReadKey();
}
}
}
这段代码在包含 Main 方法的类中定义了静态字段和静态构造方法。因为 Main 方法也是一个静态方法,类的静态构造方法被调用而且它是类的入口点方法,那么它和类的静态构造方法之间是谁先调用呢?下面首先来看代码的执行结果:
类的静态构造方法被调用
Main 方法被调用
静态字段 a 的值是:11
通过代码的执行结果可以看到,因为类的入口点方法仍然是一个静态方法,那么在任何静态成员被调用之 前,静态构造方法都首先被调用。所以,可以得出如下结论,类的静态构造方法先于类的 Main 方法被调用。










