详解c# 类的构造方法

2019-12-30 16:00:30王振洲

这段代码将静态构造方法做了修改,在方法体内将静态字段 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 方法被调用。