c# - 即使未使用变量,是否始终会执行局部变量赋值?

标签 c# variable-assignment compiler-optimization

我有一个静态容器类,它包含某个类的句柄 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 的输出方法写入控制台?

最佳答案

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

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

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

总结:

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

关于c# - 即使未使用变量,是否始终会执行局部变量赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14578641/

相关文章:

c# - 在 .NET 中使用 XmlReader 对非常大的 XML 文件进行 XSLT 转换

c# - 找不到 Cefsharp CefSettings 和 RegisterScheme

matlab - 如何在 MATLAB 中将单个值/矩阵分配给多个变量?

python - 多重赋值语义

c++ - 对静态变量的赋值是函数的结果,该函数在内部更改了该静态变量

c++ - 如何拥有 "constexpr and runtime"别名

c++ - 优化问题

c# - 避免 .NET Native 错误

c# - 使用对象初始化器 - Resharper 建议

c# - 我可以从 NHibernate 获取底层连接和事务对象吗?