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

Deadly 提交于 2019-12-18 07:30:21

问题


Given a static class with an initializer method:

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

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

How can I ensure the initializer is run before Main()?

The best I can think of is to add this to Foo:

    private class Initializer
    {
        private static bool isDone = false;
        public Initializer()
        {
            if (!isDone)
            {
                init();
                isDone = true;
            }
        }
    }
    private static readonly Initializer initializer = new Initializer();

Will this work or are there some unforeseen caveats? And is there any better way of doing this?


回答1:


Simply do the initialization inside a static constructor for Foo.

From the documentation:

A static constructor is called automatically to initialize the class before the first instance is created or any static members are referenced.




回答2:


There are static constructors in C# that you can use.

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

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

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



回答3:


Move your code from an internal static method to a static constructor like this:

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

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

This way you are quite sure that the static constructor will be run on first mention of your Foo class, whether is a construction of an instance or access to a static member.




回答4:


Place your initialization code in the static constructor of the class

static Foo()
{
    // Initialization code
}

This constructor is run the first time the class is accessed.

You can use RunClassConstructor to trigger the static constructor of the class before using a class. This can be useful if, for instance, this class registers itself in a IOC container or something like this.

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

You find the RuntimeHelpers in the System.Runtime.CompilerServices namespace.



来源:https://stackoverflow.com/questions/13622754/how-can-i-run-a-static-initializer-method-in-c-sharp-before-the-main-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!