【问题标题】:.NET, how to establish whether field has been nulled.NET,如何确定字段是否已为空
【发布时间】:2013-01-05 10:03:07
【问题描述】:

这很简单,我敢肯定。我试过搜索,但没有快乐。

假设我有一个A 类型的对象,它有一个F 类型为B 的公共字段。我创建一个B 的实例并设置A.F=B

A.F == null 的结果为 False。 A.F is B 的结果为 True。

但随后B 设置为空。 A.F 属性仍然保存 B 的旧实例的句柄。 A.F 的运行时查找仍将其显示为 B 类型。所以测试A.F == null 仍然给出False,测试A.F is B 仍然给出True。即使B 已被丢弃。

那么我如何检查A.F 属性以查看其句柄现在是否指向消失的对象?

【问题讨论】:

    标签: c# memory-management garbage-collection


    【解决方案1】:

    .NET 引用永远不会指向消失的对象;这就是 GC 的全部意义所在。您的示例描述了对单个对象的两个独立但相同的引用。更改一个引用不会更改任何其他引用。基本上你描述的是这样的:

     int x = 1;
     obj.Foo = x;
     x = 0;
    

    然后期望 obj.Foo 为 0。它不会是:它会是 1,直到你改变它。引用的工作方式相同。

    您没有“丢弃”B 的实例。那个实例仍然非常高兴。您刚刚删除了对它的一个引用。

    换一种说法:在我的 Facebook 上,我将“唐娜”列为我的妻子。如果我现在清除该字段(我不打算这样做),我还没有删除她的帐户。

    【讨论】:

    • 男孩,我觉得自己很愚蠢。是的,还有一个指向它的指针,所以它被保留了。有没有办法丢弃所有指向对象的指针?我目前正在使用代码,因此对象 B 必须保留对它的所有引用的列表。因此,当我销毁 B 时,它会删除所有指针。这意味着每当我设置对 B 的引用时,我必须确保在 B 中调用一个方法,以便 B 可以记录该引用。
    • @David 不,没有办法做到这一点。
    【解决方案2】:

    如果A.F == nullFalse 并且A.FB,那么A.FB 引用的是同一个对象,该对象不为空。 如果您认为 B 在您的代码中此时应该为 null,因为您之前将其设置为 null,那么您的代码中可能还有另一个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多