静态修饰符在构造函数中的作用是什么?

5

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

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.
  }
}

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


1
实际上,在静态构造函数中,所有修饰符都是不允许的,因此它只能是 static FooPlugin()。此外,它会自动调用,没有办法按需执行它。 - SWeko
@SWeko:我的错,你是对的,我忘记了具体是什么。 - the_drow
6个回答

6

这是类的静态初始化。

当您使用类的方法、字段、属性或其他任何内容时,它将被调用。换句话说,它将在您第一次使用该类时被调用。

请参阅MSDN上的静态构造函数

您也可以在此处初始化静态对象。

在您的示例中,似乎编写该代码的人想要在使用FooPlugin之前调用SomeObject.StaticFunction()一次,可能是为了在使用FooPlugin之前初始化SomeObject

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

请参阅MSDN上的CA1810:行内初始化引用类型静态字段


再说一遍,这是什么意思?我还不会C#。在C++中你不能做这样的事情。 - the_drow
正确的答案,但我对该声明中的“public”有点困惑。当我偶然在静态构造函数上指定访问修饰符时,我总是会收到编译时错误。这在C# 4.0中有所改变吗? - Fyodor Soikin
2
@the_drow: 把C++从你的头脑中移除,你的生活会立即变得更好。静态构造函数是一种仅在第一次尝试使用类时被调用一次的方法。这里有什么不清楚的吗? - Fyodor Soikin
我改了它。 @brickner:那么它为什么在那里?IPlugin和对静态函数的调用与此有何关系? - the_drow
@Fyodor Soikin:答案的第一个版本只是:“这是类的静态初始化。” - the_drow
是的,除了在这种情况下的目的外。 JsonTune已经解释得很好了。我的想法是无法确定上下文,因此难以理解“这种情况”指的是什么。 但是,如果您有任何其他问题,请告诉我。 - the_drow

3

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

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

阅读更多信息请访问MSDN - Static Constructors (C#)


嗯,但它确切地是什么意思呢? - the_drow
1
@the_drow - 嗯,链接就是为了那个。但我已经发布了来自MSDN的相关引用。 - Justin Niessner

3

我无法确定在你的特定情况下为什么需要静态构造函数,但通常静态构造函数有以下几种用途:

  1. 类的所有实例都需要访问同一个对象实例。
  2. 某个外部对象的初始化是该类的所有实例的前提条件(在你的示例中似乎就是这种情况)。
  3. 某个数据结构或服务的初始化需要重复执行太多次以至于耗费过多时间(这是第一种情况的一种变体)。

这是第二个。现在我明白了。该函数初始化ORM中的某些内容。 - the_drow
1
如果你有C++的背景,相应的内容可以在这里找到解释:https://dev59.com/oXM_5IYBdhLWcg3w2XLw - JasonTrue

1
这是一个更简单的例子,说明静态构造函数何时有用。以下类具有一些静态字段。第一个可以在其声明中内联初始化,但第二个则不行。静态构造函数来拯救了它。它提供的关键保证是,在初始化代码运行之前,无法访问类的任何部分。
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;
    }
}

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

0
仅作为对上述答案的补充,静态构造函数(或在Java中的静态块)只有在将类首次加载到内存中时才会执行。其目的是初始化静态字段,否则这些字段将假定数据类型的相应默认值。有时我使用静态构造函数来构建一个对象模型,我希望在整个应用程序的生命周期中都能使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接