我如何运行一个静态构造函数?
我想执行一个类的静态构造函数(即我想“加载”类),而不创build一个实例。 我怎么做?
奖金问题:.NET 4和旧版本有什么区别吗?
编辑:
- 这个类不是静态的。
- 我想在创build实例之前运行它,因为它需要一段时间才能运行,而且我希望在第一次访问时避免这种延迟。
- 静态ctor初始化
private static readonly
字段,因此不能在方法中运行。
其他答案是非常好的,但是如果你需要强制一个类的构造函数运行而不需要引用types(即reflection),你可以使用:
Type type = ...; System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);
只要引用你的一个静态字段。 这将强制您的静态初始化代码运行。 例如:
public class MyClass { private static readonly someStaticField; static MyClass() { someStaticField = ... } // any no-op method call accepting your object will do fine public static void TouchMe() { Equals(someStaticField, null); } }
用法:
// initialize statics MyClass.TouchMe();
cctor(静态构造函数)将在下列任何一种情况下被调用;
- 你创build一个类的实例
- 任何静态成员都被访问
- 任何时候之前,如果BeforeFieldInit设置
如果你想明确调用cctor,假设你有其他静态成员,只需调用/访问它们。
如果你在cctor中没有做任何有趣的事情,编译器可能会决定将它标记为BeforeFieldInit,这将允许CLR提前select执行cctor。 这在这里有更详细的解释: http : //blogs.msdn.com/davidnotario/archive/2005/02/08/369593.aspx
没有必要这样做,一个静态构造函数的全部意义在于,在第一次访问时第一次初始化类时它将运行一次。 如果您想要按需运行某些内容,请考虑将初始化代码添加到由构造函数调用的公共方法中。 然后你可以随时调用这个方法。 但是我不确定你为什么要这样做?
访问静态方法时,并不总是调用静态构造函数!
我注意到,如果您在基类中调用静态方法,则不会调用超类的静态构造函数。 这种意外的行为已经被咬了很多次。
正如其他人所说,静态构造函数自动运行。 如果你需要明确,也许你应该重构成一个静态方法,你可以明确地运行?
显式调用静态方法当然也会确保静态构造函数已经被执行。
编辑
静态构造函数在任何静态成员被引用时运行。 你可以简单地创build一个名为initialize
的虚拟方法,它什么都不做,但是确保框架调用静态构造函数。
静态构造函数在您第一次访问该类时自动运行。 没有必要(或能力)自己“运行”它。