为什么我的静态构造函数似乎只执行过一次

本文关键字:一次 执行 静态 我的 构造函数 为什么 | 更新日期: 2023-09-27 18:00:53

当我的类中有一个static字段时:

public static int Counter = 0;

使用static构造函数:

static Class() { 
    Counter++; 
}

当我创建这个类的对象并检查Class.Counter时,它会显示正确的1

但是,当我创建同一类的另一个对象时,Class.Counter仍然是1

为什么?

为什么我的静态构造函数似乎只执行过一次

因为静态构造函数只执行一次。

来自C#规范:

类的静态构造函数在给定的应用程序域中最多执行一次。静态构造函数的执行由应用程序域中发生的以下第一个事件触发:

  • 将创建该类的实例
  • 类的任何静态成员都被引用

这是因为您在静态构造函数中递增计数器,它将只执行一次。

静态构造函数C#-MSDN

静态构造函数用于初始化任何静态数据,或执行需要只执行一次的特定操作。在创建第一个实例或任何引用静态成员。

你可以通过增加实例构造函数来修复它,比如:

class Class
{
    public static int counter = 0;
    public Class()
    {
        counter++;
    }
}

为了线程安全,使用Interlocked.Increment(ref counter);而不是counter++

Selman22正确无误,这里有更多细节:

来自MSDN

静态构造函数用于初始化任何静态数据,或执行只需要执行一次的特定操作。它是在>创建第一个实例或引用任何静态成员之前自动调用的。

静态构造函数具有以下属性:

  • 静态构造函数不接受访问修饰符或不具有参数
  • 在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类
  • 不能直接调用静态构造函数
  • 用户无法控制何时在中执行静态构造函数程序
  • 静态构造函数的典型用法是当类使用日志时文件,构造函数用于向该文件写入条目
  • 静态构造函数在为非托管代码,此时构造函数可以调用LoadLibrary方法

如果静态构造函数抛出异常,运行时将不会再次调用它,并且在程序运行的应用程序域的生存期内,该类型将保持未初始化状态。

引用url:http://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx