静态构造函数在非静态类中的作用是什么?

Aag*_*age 28 c# oop static constructor

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

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

    static Thing()
    {
        Console.WriteLine("static");
    }
}
Run Code Online (Sandbox Code Playgroud)

初始化Thing静态构造函数的实例时,首先调用它.

输出:

静态的

非静态

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

使用静态构造函数时是否有任何需要考虑的事项?

Bol*_*ock 30

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

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

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

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

这里,"之前"意味着"紧接在之前",以及这些事情中的任何一个首先发生.这是因为静态构造函数在单个程序执行中每种类型只调用一次.


使用静态构造函数时是否有任何需要考虑的事项?

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

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

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

  • 无法直接调用静态构造函数.

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

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

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

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

除了确保不尝试访问非静态成员之外,由于您不在实例构造函数中,因此您必须考虑的另一个主要问题是在程序执行期间始终在特定时间调用静态构造函数.如上所述,除了通过控制"创建第一个实例或引用任何静态成员"时,您无法控制它.