问题
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