在C#中,在调用main()方法之前是否会初始化所有静态变量?

时间:2013-10-12 14:19:30

标签: c# .net static .net-assembly static-members

我特别关注的是:

  • 在引用/依赖类中定义的类中的静态变量,包含在外部DLL中。在我的示例中,第三方程序集中的所有类型都不会在程序的后面引用。 (比方说执行5分钟)。

是否只加载第三方程序集的静态变量?

谢谢, 瑞

3 个答案:

答案 0 :(得分:3)

根据C#规范说:

  

如果类中存在静态构造函数,则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,静态字段初始化器在第一次使用该类的静态字段之前的实现相关时间执行。例子

whiteout一个静态构造函数,你无法准确预测静态变量何时初始化,但保证在第一次使用之前初始化它们。但是在你引用它们的程序集之前肯定它们没有被初始化

答案 1 :(得分:1)

所有静态字段在首次使用之前都会初始化。这可以通过编译器显式声明或隐式提供的类型初始值设定项(静态构造函数)来完成。未在类声明中指定值的静态字段将初始化为其相应类型的默认值。

答案 2 :(得分:1)

如果静态字段是构造函数可能抛出异常的对象引用,请注意:

class Foo
{
    public Foo() { throw new Exception("boom"); }
}
class Bar
{
    private static Foo baz = new Foo();
    public Bar()
    {
        //trying to create a Bar will throw TypeInitializationException
    }
    public static void BarNone()
    {
        //trying to call a static method on Bar will throw TypeInitializationException
    }
}

首次使用Bar时(构造或调用Bar上的静态方法),您将获得TypeInitializationException,如上所示。