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标题已更改:-)