2009-09-17 40 views

回答

79

第一次访问该类时。

Static Constructors (C# Programming Guide)

静态构造用于初始化任何静态数据,或者执行需要仅一次执行的特定动作。它在创建第一个实例或引用任何静态成员之前自动调用。

+0

谢谢,这是有道理的,当我正确思考它! – Jason 2009-09-17 08:10:03

+5

有趣的是,它表示“在创建第一个实例或引用任何静态成员之前”。当它实际被调用时,在*有一些余地。 – 2011-05-13 10:20:25

+5

@TimBarrass由于规范的某些其他要求,“之前”实际上是“之前” - 请参阅Jon Skeet的文章在其他答案中引用 - http://stackoverflow.com/a/1437372/477420 – 2015-09-12 05:01:07

34

尽管直截了当的文档,它并不像你所期望的那么简单。 Jon Skeet的文章http://csharpindepth.com/Articles/General/Beforefieldinit.aspx详细讨论了这个问题。

总结:

静态构造是保证将第一参考该类别的成员之前立即执行- 无论是创建实例或类的自己的静态方法/属性的。

请注意,在第一次参考特定字段之前,保证在任何时间执行静态初始化器(如果没有静态构造函数)

+0

+1。打倒我,但只是。 ;) – AnthonyWJones 2009-09-17 08:04:47

+0

这是非常有趣的阅读,谢谢男士们。 – Jason 2009-09-17 08:10:48

+0

提到的文章现在在Jon Skeet的网站上:http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy 2014-07-23 09:10:27

17

在您使用类中的任何内容之前调用静态构造函数,但是在发生这种情况时的确切时间取决于实现。

保证在第一个静态成员被访问之前和第一个实例被创建之前被调用。如果这个类从未被使用过,那么静态构造函数就不能保证被调用。

+2

发生时*如果该实现遵循ECMA C#规范,则*不是“实现”:“静态构造函数的执行是由在应用程序域内发生下列第一个事件触发的:[1]该类的实例被创建。[2]引用该类的任何静态成员。“ (第17.11节,http://www.ecma-international.org/publications/standards/Ecma-334.htm) – LukeH 2009-09-17 09:16:10

+0

@Luke:“静态构造函数执行的确切时间是依赖于实现的”http://ondotnet.com /酒吧/ A/DOTNET/2003/07/07/staticxtor。html – Guffa 2009-09-17 10:12:44

+2

@Guffa:这可能是文章作者的解释,但是你不会在Microsoft或ECMA/ISO版本的C#规范中找到这种措辞。 – LukeH 2009-09-17 10:37:04

0

如果从父类调用静态方法,则不会调用静态构造函数,而是明确指定它。这里是一个例子,如果b.methoda()被调用,b构造函数不会被调用。

static void Main(string[] args) 
{ 
    b.methoda(); 
} 

class a 
{ 
    public static void methoda() 
    { 
     //using initialized method data 
    } 
} 

class b : a 
{ 
    static b() 
    { 
     //some initialization 
    } 
}  
相关问题