22

给定一个带有初始化方法的静态类:

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();

这会起作用还是有一些不可预见的警告?有没有更好的方法来做到这一点?

4

4 回答 4

24

只需在静态构造函数中为Foo.

从文档中:

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

于 2012-11-29T09:40:25.627 回答
14

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

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

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

    internal static init()
    {
        // Do some initialization...
    }
}
于 2012-11-29T09:46:41.917 回答
7

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

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

  static Foo()
  {
    // Do some initialization...
  }
}

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

于 2012-11-29T09:45:57.670 回答
2

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

static Foo()
{
    // Initialization code
}

此构造函数在第一次访问该类时运行。

您可以RunClassConstructor在使用类之前触发类的静态构造函数。例如,如果此类将自身注册到 IOC 容器或类似的东西中,这将很有用。

RuntimeHelpers.RunClassConstructor(typeof(Foo).TypeHandle);

您可以RuntimeHelpersSystem.Runtime.CompilerServices命名空间中找到 。

C# 9.0 添加了模块初始化程序,允许您为程序集编写初始化代码,而无需显式调用任何内容。

将该[ModuleInitializer]属性应用于静态 void 无参数方法以使其成为模块初始化程序。

[ModuleInitializer]
internal static void MyAssemblyInitializer()
{
    // ...
}
于 2019-12-10T21:19:07.883 回答