我如何运行一个静态构造函数?

我想执行一个类的静态构造函数(即我想“加载”类),而不创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(静态构造函数)将在下列任何一种情况下被调用;

  1. 你创build一个类的实例
  2. 任何静态成员都被访问
  3. 任何时候之前,如果BeforeFieldInit设置

如果你想明确调用cctor,假设你有其他静态成员,只需调用/访问它们。

如果你在cctor中没有做任何有趣的事情,编译器可能会决定将它标记为BeforeFieldInit,这将允许CLR提前select执行cctor。 这在这里有更详细的解释: http : //blogs.msdn.com/davidnotario/archive/2005/02/08/369593.aspx

没有必要这样做,一个静态构造函数的全部意义在于,在第一次访问时第一次初始化类时它将运行一次。 如果您想要按需运行某些内容,请考虑将初始化代码添加到由构造函数调用的公共方法中。 然后你可以随时调用这个方法。 但是我不确定你为什么要这样做?

访问静态方法时,并不总是调用静态构造函数!

我注意到,如果您在基类中调用静态方法,则不会调用超类的静态构造函数。 这种意外的行为已经被咬了很多次。

正如其他人所说,静态构造函数自动运行。 如果你需要明确,也许你应该重构成一个静态方法,你可以明确地运行?

显式调用静态方法当然也会确保静态构造函数已经被执行。

编辑

静态构造函数在任何静态成员被引用时运行。 你可以简单地创build一个名为initialize的虚拟方法,它什么都不做,但是确保框架调用静态构造函数。

静态构造函数在您第一次访问该类时自动运行。 没有必要(或能力)自己“运行”它。