给定一个带有初始化方法的静态类:
public static class Foo
{
// Class members...
internal static init()
{
// Do some initialization...
}
}
如何确保初始化程序在Main()
之前运行?
我能想到的最好的方法是将其添加到Foo
:
private class Initializer
{
private static bool isDone = false;
public Initializer()
{
if (!isDone)
{
init();
isDone = true;
}
}
}
private static readonly Initializer initializer = new Initializer();
这会起作用还是有一些不可预见的警告?有没有更好的方法呢?
答案 0 :(得分:16)
只需在Foo
内为{{1}}进行初始化。
来自文档:
自动调用静态构造函数来初始化类 在创建第一个实例之前或任何静态成员之前 引用。
答案 1 :(得分:9)
您可以使用C#中的static constructors。
public static class Foo
{
// Class members...
static Foo(){
init();
// other stuff
}
internal static init()
{
// Do some initialization...
}
}
答案 2 :(得分:4)
将代码从internal static
方法移至static
constructor,如下所示:
public static class Foo
{
// Class members...
static Foo()
{
// Do some initialization...
}
}
通过这种方式,您可以确定静态构造函数将在第一次提及Foo
类时运行,无论是构造实例还是访问静态成员。
答案 3 :(得分:0)
将初始化代码放在类的静态构造函数中
static Foo()
{
// Initialization code
}
此构造函数在第一次访问该类时运行。
在使用类之前,可以使用RunClassConstructor
来触发类的静态构造函数。例如,如果此类在IOC容器或类似的容器中注册自己,这将很有用。
RuntimeHelpers.RunClassConstructor(typeof(Foo).TypeHandle);
您在RuntimeHelpers
命名空间中找到System.Runtime.CompilerServices
。