为什么CLR通过初始化优化掉未使用的静态字段?

时间:2015-10-01 10:47:13

标签: c# .net optimization initialization static-members

让我们有两个代码段:

public class Foo
{
    private static Bar _unused = new Bar();
}

B:

public class Foo
{
    private static Bar _unused;

    static Foo()
    {
        _unused = new Bar();
    }
}

如果 A ,CLR甚至不会调用Bar ctor(除非它是调试版本或附加了调试器),但是如果 B 它被调用所有情况。

问题是,在Bar构造函数中,可以有一个调用来使这个实例可以从其他地方访问 - 最典型的是事件订阅

所以:

  • 为什么案例 A B 的评估方式不同?
  • 为什么CLR根本没有调用Bar ctor,以防 A - 因为它 在ctor完成和实例之前,不应将其评估为垃圾 被分配到适当的字段?

1 个答案:

答案 0 :(得分:7)

如果你don't create a constructor

  

类的静态字段变量初始值设定项对应于按照它们出现在类声明中的文本顺序执行的赋值序列。如果类中存在静态构造函数(第10.11节),则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,静态字段初始值设定项在首次使用该类的静态字段之前的实现相关时间执行。

如果你do have a static constructor

  

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