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

时间:2012-11-29 09:37:38

标签: c# .net static-methods static-classes static-initialization

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

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 个答案:

答案 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