C# 为什么我的静态构造函数似乎只执行一次?
当我的类中有一个C# 为什么我的静态构造函数似乎只执行一次?,c#,static,static-members,C#,Static,Static Members,当我的类中有一个静态字段时: public static int Counter = 0; 使用静态构造函数: static Class() { Counter++; } 当我创建此类的对象并选中class.Counter时,它会显示1哪个是正确的 但是当我创建同一类的另一个对象时,class.Counter仍然保持1 为什么会这样?因为静态构造函数只执行一次 发件人: 类的静态构造函数在给定的应用程序域中最多执行一次。静态构造函数的执行由应用程序域中发生的以下第一个事件触发:
静态
字段时:
public static int Counter = 0;
使用静态
构造函数:
static Class() {
Counter++;
}
当我创建此类的对象并选中class.Counter
时,它会显示1
哪个是正确的
但是当我创建同一类的另一个对象时,class.Counter
仍然保持1
为什么会这样?因为静态构造函数只执行一次 发件人: 类的静态构造函数在给定的应用程序域中最多执行一次。静态构造函数的执行由应用程序域中发生的以下第一个事件触发:
- 将创建该类的一个实例
- 将引用该类的任何静态成员
这是因为在静态构造函数中递增计数器,并且只执行一次 静态构造函数用于初始化任何静态数据,或 执行只需执行一次的特定操作。 它在创建第一个实例或任何其他实例之前自动调用 静态成员被引用 您可以通过增加实例构造函数来修复它,如:
class Class
{
public static int counter = 0;
public Class()
{
counter++;
}
}
对于螺纹安全使用
联锁增量(参考计数器)代码>而不是计数器+++
Selman22正确无误,下面是一些更详细的信息:
来自MSDN
静态构造函数用于初始化任何静态数据,或执行只需执行一次的特定操作。
在>创建第一个实例或引用任何静态成员之前,会自动调用它
静态构造函数具有以下属性:
- 静态构造函数不接受访问修饰符或具有参数
- 在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类
- 不能直接调用静态构造函数
- 用户无法控制何时在中执行静态构造函数
节目
- 静态构造函数的典型用法是当类使用日志时
文件和构造函数用于将条目写入此文件
- 静态构造函数在为创建包装器类时也很有用
非托管代码,此时构造函数可以调用LoadLibrary方法
如果静态构造函数抛出异常,运行时将不会再次调用它,并且在程序运行的应用程序域的生命周期内,该类型将保持未初始化状态
参考url:MSDN应该是您的首选,而不是stackoverflow。如果您要走这条路,请确保考虑多线程。有两种线程安全的替代方案可以在长时间运行时为您解决问题-在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数初始化类。顺便说一句,如果您计划使用全局实例计数器(为什么,顺便说一句?),你应该使用。我给你的最终极的掌纹。@Liath,在这种情况下是Interlocked.Increment(ref counter)代码>可以使用。为什么静态构造函数只执行一次?->因为静态构造函数只执行一次。很好的回答。:)@PavelRyzhov标题已更改:-)