【问题标题】:Why does it seem as if my static constructor is only executed once?为什么我的静态构造函数似乎只执行一次?
【发布时间】:2014-04-30 15:07:28
【问题描述】:

当我的班级中有 static 字段时:

public static int Counter = 0;

使用static 构造函数:

static Class() { 
    Counter++; 
}

当我创建此类的对象并检查 Class.Counter 时,它显示 1 是正确的。

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

为什么会这样?

【问题讨论】:

  • MSDN 应该是你的首选,而不是 stackoverflow。
  • 如果您走这条路,请确保您考虑多线程。从长远来看,有几个线程安全的替代方案可以为您解决问题
  • 来自msdn.microsoft.com/en-us/library/k9x6w0hc.aspx - 在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。
  • 顺便说一句,如果您打算拥有一个全局实例计数器(为什么,顺便说一句?),您应该使用Interlocked.Increment
  • 我给你的最极致的掌纹。

标签: c# static static-members


【解决方案1】:

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

来自C# Specification

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

  • 创建了一个类的实例。
  • 类的任何静态成员都被引用。

【讨论】:

  • 为什么静态构造函数只执行一次? -> 因为静态构造函数只执行一次。很好的答案。 :)
  • @PavelRyzhov 标题已更改 :-)
【解决方案2】:

那是因为你在静态构造函数中增加你的计数器,它只会被执行一次。

static constructor C# - MSDN

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

您可以通过在实例构造函数中递增来修复它,例如:

class Class
{
    public static int counter = 0;

    public Class()
    {
        counter++;
    }
}

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

【讨论】:

  • @Liath,是的,在这种情况下可以使用Interlocked.Increment(ref counter);
【解决方案3】:

Selman22 是正确的,这里有更多细节:

来自 MSDN

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

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

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

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

参考网址:http://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多