代码之家  ›  专栏  ›  技术社区  ›  the_drow

构造函数上的静态修饰符是什么意思?

c#
  •  5
  • the_drow  · 技术社区  · 15 年前

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

    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 回复  |  直到 15 年前
        1
  •  6
  •   brickner    15 年前

    这是类的静态初始化。

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

    static constructors on MSDN

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

    在你的例子中,似乎写这封信的人想打电话给 SomeObject.StaticFunction() 在人们使用之前 FooPlugin ,可能会在使用之前初始化 福禄考 .

    请注意,当您使用它时会有一些性能问题,而且Visual Studio(使用代码分析)可以让您知道最好是直接初始化静态字段。

    CA1810: Initialize reference type static fields inline on MSDN

        2
  •  3
  •   Justin Niessner    15 年前

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

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

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

        3
  •  3
  •   JasonTrue    15 年前

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

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

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

    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
  •  0
  •   Tony the Pony    15 年前

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

        6
  •  0
  •   Bedasso    15 年前

    只需添加上面的答案,静态构造函数(或Java中的静态块)在执行时只执行一次。 类是第一个加载的 在记忆中。目的是初始化静态字段,否则将假定数据类型的各自默认值。有时我使用静态构造函数来构建 对象模型 我希望在应用程序的整个生命周期中使用它。