加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 即使变量未使用,是否总是会执行局部变量赋值?

发布时间:2020-12-16 01:52:51 所属栏目:百科 来源:网络整理
导读:我有一个静态容器类,它包含一些类A的句柄: public static class Container{ private static A _a; public static void Register(A a) { _a = a; } public static void Run() { _a.DoIt(); }} 容器的注册实例在A构造函数中执行: public class A{ public A()
我有一个静态容器类,它包含一些类A的句柄:

public static class Container
{
    private static A _a;        
    public static void Register(A a) { _a = a; }
    public static void Run() { _a.DoIt(); }
}

容器的注册实例在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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读