将始终执行局部变量赋值,即使变量未使用

本文关键字:变量 未使用 赋值 执行 局部变量 | 更新日期: 2023-09-27 17:56:39

我有一个静态容器类,它保存了某个类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% 确定在调用 Init 方法时始终实例化A

示例 当我运行以下代码时:

Init();
...
Container.Run();

是否将始终定义Container._a并将DoIt方法的输出写入控制台?

将始终执行局部变量赋值,即使变量未使用

编译器通常不知道 A 的构造函数是否有可观察到的副作用,因此它将始终调用它。不过,它可能不会保留变量"a"。

因此,将调用构造函数,但结果可能不会分配给变量;相反,如果没有其他对象引用它,则 A 对象可能会立即注册以进行垃圾回收。(在您的情况下,其他东西确实引用了它 - 即 Container 类 - 所以它不会被垃圾收集!

在您的情况下,构造函数在任何情况下都明显存在副作用(因此编译器优化构造函数调用将是一个主要错误)。

总结:

  • 将始终调用构造函数。
  • 可能不会将结果分配给局部变量,因为编译器知道它没有可观察到的副作用。
  • 在您的代码中,其他内容保留对构造对象的引用,因此它不会被 GCed。