构造函数上的static修饰符意味着什么?

时间:2010-06-09 20:06:42

标签: c#

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

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

任何想法构造函数上的静态修饰符是什么意思,为什么在这种情况下它是必需的?

6 个答案:

答案 0 :(得分:6)

这是类的静态初始化。

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

请参阅static constructors on MSDN

您也可以在这里初始化静态内容。

在您的示例中,似乎无论是谁编写的都希望在人们使用SomeObject.StaticFunction()之前拨打FooPlugin一次,可能会在使用FooPlugin之前对其进行初始化。

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

请参阅CA1810: Initialize reference type static fields inline on MSDN

答案 1 :(得分:3)

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

  

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

MSDN - Static Constructors (C#)

了解详情

答案 2 :(得分:3)

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

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

答案 3 :(得分: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;
    }
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

相关问题