2011-05-10 198 views
23

今天我和同事讨论了一下,并得出以下几点结论。如果一切正确或者需要修改,请点亮一些灯。静态变量初始化

  1. 当静态构造函数未在类中定义时,静态字段在使用之前被初始化。
  2. 当静态构造函数在类中定义时,静态字段在其使用之前或作为(之前)实例创建的一部分进行初始化。
  3. 如果在静态方法中没有访问静态字段并且调用该静态方法。只有静态构造函数在该类中定义时,静态字段才会被初始化。
  4. 如果可能的话,应该避免在类中使用静态构造函数。
+1

你是什么意思的“静态变量”,属性?场?你不能在一个方法中声明一个变量为静态的。 – 2011-05-10 12:32:02

+1

是的,在C#中,静态变量未在方法中声明。由静态变量我意味着领域。我已经更新了这个问题。 – Azodious 2011-05-10 12:36:01

回答

7

1.-3。你不能确切地知道它何时发生,所以你不能依赖它。一个静态构造函数会给你一些控制,当它被调用时会发生什么。

public class UtilityClass 
{ 
    // 
    // Resources 
    // 

    // r1 will be initialized by the static constructor 
    static Resource1 r1 = null; 

    // r2 will be initialized first as static constructors are 
    // invoked after the static variables are initialized 
    static Resource2 r2 = new Resource2(); 

    static UtilityClass() 
    { 
    r1 = new Resource1(); 
    } 

    static void f1(){} 
    static void f2(){} 
} 

4.Static构造函数是慢

静态构造执行的确切定时是依赖于实现的,但必须符合以下规则:

  • 的静态构造一类 在创建任何 类实例之前执行。
  • 类 的静态构造函数在该类的任何静态 成员之前执行
    引用。
  • 类 的静态构造函数在类的静态字段初始值设定项(如果有)后执行。
  • 类 的静态构造函数在 单个程序实例化中最多执行一次。
  • 两个 静态构造函数的两个
    不同的类之间的执行顺序没有指定。
+0

但必须存在一些关于这些的描述。并想知道这些点是否合乎逻辑,这就是CLR的工作原理? – Azodious 2011-05-10 12:34:07

+0

-1当然,你知道何时调用静态ctor。即,当创建类的第一个实例或第一次访问任何静态成员(方法,字段)时。 – Christian 2011-05-10 12:48:46

+0

您正在写信,错误输入...我已更正 – sra 2011-05-10 12:52:46

4

所有的观点都是正确的。

应该避免使用静态构造函数的原因是因为编译器在任何地方都会调用代码来调用该类的任何方法来检查是否调用了静态构造函数。这对性能有负面影响。

你可以做的是在你的类中有一个私有静态字段,当调用默认(或其他非静态)构造函数时,它被分配一个虚拟值。这将初始化对象创建的所有静态字段。