Mat*_*att 15 .net c# static-methods static-classes static-initialization
给定一个带有初始化方法的静态类:
public static class Foo
{
// Class members...
internal static init()
{
// Do some initialization...
}
}
Run Code Online (Sandbox Code Playgroud)
如何确保之前运行初始化程序Main()?
我能想到的最好的是将其添加到Foo:
private class Initializer
{
private static bool isDone = false;
public Initializer()
{
if (!isDone)
{
init();
isDone = true;
}
}
}
private static readonly Initializer initializer = new Initializer();
Run Code Online (Sandbox Code Playgroud)
这会有用还是有一些不可预见的警告?还有更好的方法吗?
您可以使用C#中的静态构造函数.
public static class Foo
{
// Class members...
static Foo(){
init();
// other stuff
}
internal static init()
{
// Do some initialization...
}
}
Run Code Online (Sandbox Code Playgroud)
将您的代码从internal static方法移动到static构造函数,如下所示:
public static class Foo
{
// Class members...
static Foo()
{
// Do some initialization...
}
}
Run Code Online (Sandbox Code Playgroud)
这样,您就非常确定静态构造函数将在第一次提到您的Foo类时运行,无论是实例的构造还是对静态成员的访问。
将初始化代码放在类的静态构造函数中
static Foo()
{
// Initialization code
}
Run Code Online (Sandbox Code Playgroud)
该构造函数在第一次访问该类时运行。
您可以RunClassConstructor在使用类之前触发类的静态构造函数。例如,如果此类将自身注册到 IOC 容器或类似的容器中,这可能会很有用。
RuntimeHelpers.RunClassConstructor(typeof(Foo).TypeHandle);
Run Code Online (Sandbox Code Playgroud)
您可以在命名空间RuntimeHelpers中找到System.Runtime.CompilerServices。
C# 9.0添加了模块初始化程序,允许您为程序集编写初始化代码,而无需显式调用任何内容。
将该[ModuleInitializer]属性应用于 static void 无参数方法,使其成为模块初始值设定项。
static Foo()
{
// Initialization code
}
Run Code Online (Sandbox Code Playgroud)