【问题标题】:What does a static modifier on a constructor means?构造函数上的静态修饰符是什么意思?
【发布时间】:2011-03-01 20:53:47
【问题描述】:

我在工作中看到了这样的代码:

class FooPlugin : IPlugin // IPlugin is a Microsoft CRM component, it has something special about it's execution
{
  static FooPlugin()
  {
     SomeObject.StaticFunction(); // The guy who wrote it said it's meaningful to this question but he can't remember why.
  }
}

知道构造函数上的静态修饰符是什么意思吗?为什么在这种情况下需要它?

【问题讨论】:

  • 实际上,静态构造函数上不允许使用所有修饰符,因此它只是静态 FooPlugin()。这也是自动调用的,无法按需执行。
  • @SWeko:你说得对,我忘了那里到底有什么。

标签: c#


【解决方案1】:

这是类的静态初始化。

当你使用类的方法、字段、属性或其他任何东西时,它会被调用。换句话说,它会在你第一次使用这个类时被调用。

static constructors on MSDN

你也可以在这里初始化静态的东西。

在您的示例中,似乎在人们使用FooPlugin之前想要调用SomeObject.StaticFunction()的人,可能会在使用FooPlugin之前对其进行初始化。

请注意,使用它时会有一些性能损失,Visual Studio(使用代码分析)可以让您知道最好内联初始化静态字段。

CA1810: Initialize reference type static fields inline on MSDN

【讨论】:

  • 再说一遍,这是什么意思?我还不知道C#。在 C++ 中,你不能做这样的事情。
  • 正确答案,但我对该声明中的public 有点困惑。当我不小心在静态构造函数上指定了访问修饰符时,我总是遇到编译时错误。它在 C# 4.0 中发生了变化吗?
  • @the_drow:把 C++ 抛在脑后,你的生活会立刻变得更好。静态构造函数是在您第一次尝试使用该类时只调用一次的方法。这里有什么不清楚的地方?
  • 我改了。 @brickner:那它为什么在那里呢? IPlugin 和对静态函数的调用与它有什么关系?
  • @Fyodor Soikin:第一个版本的答案只是:“这是类的静态初始化。”
【解决方案2】:

它定义了对象的静态构造函数。

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

阅读更多MSDN - Static Constructors (C#)

【讨论】:

  • 呃,但这到底是什么意思?
  • @the_drow - 呵呵。这就是链接的用途。但我发布了 MSDN 的相关报价。
【解决方案3】:

我不能说为什么在您的特定情况下需要它,但静态构造函数的动机通常是以下之一:

  1. 类的所有实例都需要 访问对象的同一实例,或
  2. 一些外部对象的初始化 是所有实例的先决条件 类的(看起来像你的例子中的情况)或
  3. 某些数据结构或服务的初始化需要花费太多时间来重复执行(第一种情况的变体)。

【讨论】:

【解决方案4】:

这里有一个更简单的例子,说明静态构造函数何时有用。下面的类有一些静态字段。第一个可以在其声明中内联初始化,但第二个不能。静态构造函数来救援。它提供的关键保证是在初始化代码运行之前不能访问类的任何部分。

class NeedsStaticConstructor
{

    private static Size s_size = new Size(100, 100); // can be done inline
    private static StringFormat s_format;            // more complex initialization needs code

    static NeedsStaticConstructor()
    {
        s_stateTextFormat = new StringFormat(StringFormatFlags.NoWrap);
        s_stateTextFormat.Alignment = StringAlignment.Near;
        s_stateTextFormat.LineAlignment = StringAlignment.Far;
    }
}

【讨论】:

    【解决方案5】:

    static 构造函数用于初始化类范围(即static)成员,而不是实例成员。

    【讨论】:

      【解决方案6】:

      除了上述答案之外,静态构造函数(或 Java 中的静态块)仅在 类首次加载到内存时执行一次。目标是初始化静态字段,否则将采用数据类型的相应默认值。有时我使用静态构造函数来构建我希望在应用程序的整个生命周期中使用的对象模型

      【讨论】:

        猜你喜欢
        • 2018-04-24
        • 1970-01-01
        • 2023-03-31
        • 2012-05-14
        • 2014-04-01
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多