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

本文关键字:未使用 静态 字段 优化 CLR 初始化 为什么 | 更新日期: 2023-09-27 18:15:23

我们有两个代码片段:

:

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函数(除非是调试构建或附加了调试器),但是在B情况下它在所有情况下都被调用。

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

:

  • 为什么情况AB评价不同?
  • 为什么CLR在A的情况下根本不调用Bar函数不应该将其评估为垃圾,直到tor完成和实例分配到适当的领域?

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

如果不创建构造函数:

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

如果你有一个静态构造函数:

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