.NET,如何确定字段是否已被清零

时间:2013-01-05 10:03:08

标签: c# memory-management garbage-collection

我很确定这很简单。我试图搜索,但没有快乐。

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

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

但是B设置为null。 A.F属性仍保留B旧实例的句柄。 A.F的运行时查找仍然显示为B类型。因此,测试A.F == null仍为False,测试A.F is B仍为True。即使B已被删除。

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

2 个答案:

答案 0 :(得分:8)

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

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

然后期望obj.Foo为0.它不会是:直到你改变它才会是1。参考文献的工作方式相同。

您没有“废弃”B的实例。那个例子仍然非常开心。你刚刚删除了一个引用。

换句话说:在我的Facebook上,我将“Donna”列为我的妻子。如果我现在清楚那个领域(我没有计划做),我还没有删除她的帐户。

答案 1 :(得分:0)

如果A.F == nullFalseA.FB,则A.FB引用相同的对象,该对象不为空。 如果您认为代码中B此时应该为null,因为您之前将其设置为null,您的代码中可能会有另一个错误。