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

25

考虑一个具有初始化器方法的静态类:

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

这种方法可行吗?还有没有什么未预见的注意事项?有没有更好的方式?


我不确定,但应用程序域可能会解决您的问题。(http://msdn.microsoft.com/en-us/library/6s0z09xw.aspx) - LueTm
@LueTm 有趣。你能详细说明吗? - Matt Evans
4个回答

26

只需在Foo类的静态构造函数中进行初始化。

根据文档:

静态构造函数会在首次创建实例或引用任何静态成员之前自动调用以初始化该类。


14

在C#中有可以使用的静态构造函数

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

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

    internal static init()
    {
        // Do some initialization...
    }
}

8

将你的代码从一个 internal static 方法移动到一个 静态构造函数,就像这样:

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

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

这样,你可以确定在第一次使用 Foo 类时静态构造函数会被运行,无论是实例构造还是访问静态成员。


5

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

static Foo()
{
    // Initialization code
}

这个构造函数在第一次访问类时运行。

您可以使用RunClassConstructor在使用类之前触发类的静态构造函数。如果该类在IOC容器中注册自己或执行类似操作,则此功能非常有用。

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

您可以在System.Runtime.CompilerServices名称空间中找到RuntimeHelpers
C# 9.0添加了模块初始化器,允许您为程序集编写初始化代码而无需显式调用任何内容。
[ModuleInitializer]属性应用于静态void无参数方法,以使其成为模块初始化器。
[ModuleInitializer]
internal static void MyAssemblyInitializer()
{
    // ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接