.net中的静态变量分配时间

时间:2009-12-21 15:16:11

标签: c#

何时分配静态变量,即在声明类时或在创建对象时?

4 个答案:

答案 0 :(得分:6)

它被编译成静态构造函数。因此,任何人第一次创建类的对象或在其上调用静态方法或属性时,都会发生初始化。

编辑:如果在您自己的静态构造函数代码(以及其他一些边缘情况)之前进行初始化,那么对您来说很重要,请检查注释中的divo链接。

答案 1 :(得分:4)

第一次访问课程时......

答案 2 :(得分:2)

正如其他答案所示,这将发生在类型(静态)构造函数中。如果您的类没有显式定义的类型构造函数,那么编译器将为您生成一个。但是,确切地确定何时调用此构造函数更为复杂。

如果您的类没有定义显式类型构造函数,例如

public class Foo
{
    public static int Bar = 1;
}

然后C#编译器将生成一个构造函数并使用beforefieldinit标志发出类定义。这将导致JIT编译器保证在第一次使用该类型的成员之前的某个时间调用类型构造函数,但这次是非确定性的,即不可能确切地知道何时会发生这种情况,并且它可能在比第一次使用类型成员时要早得多。

如果你的类声明了一个显式类型构造函数,例如

public class Foo
{
    public static int Bar;
    static Foo()
    {
        Bar = 1;
    }
}

然后编译器将为没有beforefieldinit标志的类发出IL。在这种情况下,JIT编译器将在确定的时间调用类型构造函数,即紧接在第一个类型成员访问之前。

以前的JIT行为称为 before-field-init 语义,后者称为精确 sematntics。重要的是要知道两者之间的差异,因为在某些情况下,它们可能具有显着的性能影响。

答案 3 :(得分:0)

一旦调用静态(类型)构造函数,就会分配静态变量。在方法执行之前调用任何第一次引用类型的方法时会发生这种情况。