为什么我的静态构造函数似乎只执行过一次
本文关键字:一次 执行 静态 我的 构造函数 为什么 | 更新日期: 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