【问题标题】:What's the function of a static constructor in a non static class?非静态类中静态构造函数的作用是什么?
【发布时间】:2013-12-25 10:28:53
【问题描述】:

我注意到一个非静态类可以有一个静态构造函数:

public class Thing
{
    public Thing()
    {
        Console.WriteLine("non-static");
    }

    static Thing()
    {
        Console.WriteLine("static");
    }
}

当您初始化Thing 的实例时,首先调用静态构造函数。

输出:

静态

非静态

这有什么需要?您是否使用它来初始化非静态类型实例上的静态字段?

在使用静态构造函数时有什么需要考虑的吗?

【问题讨论】:

  • 您自己回答to initialize static fields。阅读更多关于静态构造函数here

标签: c# oop constructor static


【解决方案1】:

您是否使用它来初始化非静态类型实例上的静态字段?

差不多,除了静态字段(或任何类型的静态成员)不与实例关联;它们与类型本身相关联,无论它是静态类还是非静态类。

documentation 列出了静态构造函数的一些属性,其中之一是:

  • 在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。

在这里,“之前”的意思是“紧接在之前”,无论哪一件事先发生。这是因为在单个程序执行中,每个类型只调用一次静态构造函数。


在使用静态构造函数时有什么需要考虑的吗?

这是上面链接给出的完整列表,它应该让您了解使用静态构造函数时会发生什么:

  • 静态构造函数不接受访问修饰符或具有参数。

  • 在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。

  • 不能直接调用静态构造函数。

  • 用户无法控制程序中何时执行静态构造函数。

  • 静态构造函数的典型用途是当类使用日志文件并且构造函数用于将条目写入该文件时。

  • 在为非托管代码创建包装类时,静态构造函数也很有用,此时构造函数可以调用LoadLibrary 方法。

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

除了确保您不尝试访问非静态成员(因为您不在实例构造函数中)之外,您必须考虑的另一件主要事情是静态构造函数总是在程序期间的特定时间被调用执行。如前所述,您无法控制这一点,只能通过控制“创建第一个实例或引用任何静态成员”的时间。

【讨论】:

    【解决方案2】:

    来自 MSDN Link:

    调用静态构造函数 自动初始化类 在创建第一个实例之前 或引用任何静态成员。

    正如您所说,它用于初始化静态字段。您只需要考虑一件事,在您创建类实例之前,非静态字段不会被初始化。

    【讨论】:

      【解决方案3】:

      您使用它来初始化或调用您的类的静态成员。

      【讨论】:

        【解决方案4】:

        这是个人经验的主观回答,但您也可以使用它来确保您的类之外的其他静态变量的初始化,您的类成员可能依赖这些变量。

        【讨论】:

          【解决方案5】:
          • 静态构造函数在类的第一个实例被调用之前被自动调用 已创建。
          • 通过在构造函数定义前加上 static 关键字来声明。
          • 它不能不带访问修饰符或有任何参数。

          【讨论】:

            【解决方案6】:

            如上所述,BoltClock 是独角兽

            但是一个很好的补充是你可以用它来实现一个很好也很容易的单例:

            public sealed class Singleton
            {
               private static readonly Singleton instance;
            
               private Singleton() { }
            
               static Singleton()
               {
                  instance = new Singleton()
               }
            
               public static Singleton Instance
               {
                  get 
                  {
                     return instance; 
                  }
               }
            }
            

            更多详情请关注http://www.codeproject.com/Articles/90896/Singletons-in-C-Static-Constructor-vs-Static-Initi

            【讨论】:

            • 但是这里没有理由使用静态构造函数;您之前的代码通常比这个更可取,这使得这是使用静态构造函数的糟糕理由。
            • 在这种情况下,我同意,这可能有点矫枉过正,但想象一下 Singleton 还有其他需要添加的属性,这些都将与任何其他依赖项一起在静态构造函数中设置。但是,这种产生单例的方法是完全线程安全的,因为静态构造函数保证在每个应用程序域和创建任何类的实例之前运行一次。因此,这是产生单例的一种简单的非锁定方式。
            • 很少有字段初始化器不足以初始化静态字段。就像这里的情况一样,从您的第一个示例中,静态字段初始化程序更短、更简单且功能相同。
            猜你喜欢
            • 2011-08-13
            • 1970-01-01
            • 2011-05-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-28
            • 1970-01-01
            • 2011-10-07
            相关资源
            最近更新 更多