我有一个静态容器类,它包含某个类A
的句柄:
public static class Container
{
private static A _a;
public static void Register(A a) { _a = a; }
public static void Run() { _a.DoIt(); }
}
在A
构造函数中执行容器A
实例的注册:
public class A
{
public A() { Container.Register(this); }
public void DoIt() { Console.WriteLine("Running!"); }
}
现在,假设我通过调用仅包含A
实例的方法来注册我的A
实例:
public void Init() { var a = new A(); }
理论上,编译是否可以优化以忽略此分配,或者我可以100%确定在调用A
方法时Init
总是实例化?
示例当我运行以下代码时:
Init();
...
Container.Run();
总是会定义Container._a
并将DoIt
方法的输出写入控制台吗?
答案 0 :(得分:7)
编译器通常不知道A的构造函数是否具有可观察的副作用,因此它总是会调用它。它可能不会保留变量'a'。
因此,将调用构造函数,但结果可能不会分配给变量;相反,如果没有别的东西引用它,A对象可能只是立即注册垃圾收集。 (在你的情况下,还有别的东西引用它 - 即Container类 - 所以它不会被垃圾收集!)
在你的情况下,构造函数显然在任何情况下都有副作用(因此编译器优化掉构造函数调用将是一个重大错误。)
总结: