繁体   English   中英

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

[英]How can I run a static initializer method in C# before the Main() method?

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

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

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

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

从文档:

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

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

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

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

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

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

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

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

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

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

static Foo()
{
    // Initialization code
}

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

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

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

您可以在System.Runtime.CompilerServices命名空间中找到RuntimeHelpers

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM