我注意到非静态类可以有一个静态构造函数:
public class Thing
{
public Thing()
{
Console.WriteLine("non-static");
}
static Thing()
{
Console.WriteLine("static");
}
}
初始化Thing
的实例时,首先调用静态构造函数。
输出:
静态
非静态
这需要什么?您是否使用它来初始化非静态类型实例上的静态字段?
使用静态构造函数时是否有任何需要考虑的事项?
答案 0 :(得分:29)
您是否使用它来初始化非静态类型实例上的静态字段?
除此之外,静态字段(或任何类型的静态成员)与实例无关;它们与类型本身相关联,无论它是静态类还是非静态类。
documentation列出了静态构造函数的一些属性,其中之一是:
- 在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。
这里,“之前”的意思是“紧接着之前”,以及这些事情中的任何一个首先发生。这是因为在单个程序执行中,每个类型只调用一次静态构造函数。
使用静态构造函数时是否有任何需要考虑的事项?
这是上面链接给出的完整列表,它可以让您了解使用静态构造函数时会发生什么:
静态构造函数不接受访问修饰符或具有参数。
在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。
无法直接调用静态构造函数。
用户无法控制程序中何时执行静态构造函数。
静态构造函数的典型用法是当类使用日志文件并使用构造函数将条目写入此文件时。
当构造函数可以调用
LoadLibrary
方法时,静态构造函数在为非托管代码创建包装类时也很有用。如果静态构造函数抛出异常,则运行时将不会再次调用它,并且该类型将在运行程序的应用程序域的生命周期内保持未初始化状态。
除了确保您不尝试访问非静态成员之外,由于您不在实例构造函数中,因此您必须考虑的另一个主要问题是在程序的特定时间始终调用静态构造函数执行。如上所述,除了通过控制“创建第一个实例或引用任何静态成员”时,您无法控制它。
答案 1 :(得分:3)
答案 2 :(得分:1)
您可以使用它来初始化或调用类的静态成员。
答案 3 :(得分:1)
这是个人经验的主观答案,但您也可以使用它来确保您班级以外的其他静态变量的初始化,您的班级成员可能依赖这些变量。
答案 4 :(得分:1)
答案 5 :(得分:0)
正如 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
找到更多详情