如何在Main()方法之前在C#中运行静态初始化方法?

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)

这会有用还是有一些不可预见的警告?还有更好的方法吗?

Jon*_*Jon 16

只需在静态构造函数中进行初始化即可Foo.

从文档:

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


Joã*_*ões 9

您可以使用C#中的静态构造函数.

public static class Foo
{
    // Class members...

    static Foo(){
        init();
        // other stuff
    }

    internal static init()
    {
        // Do some initialization...
    }
}
Run Code Online (Sandbox Code Playgroud)


SWe*_*eko 5

将您的代码从internal static方法移动到static构造函数,如下所示:

public static class Foo
{
  // Class members...

  static Foo()
  {
    // Do some initialization...
  }
}
Run Code Online (Sandbox Code Playgroud)

这样,您就非常确定静态构造函数将在第一次提到您的Foo类时运行,无论是实例的构造还是对静态成员的访问。


Oli*_*bes 5

将初始化代码放在类的静态构造函数中

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)