我很确定这很简单。我试图搜索,但没有快乐。
假设我有一个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
属性以查看其句柄现在是否指向消失的对象?
答案 0 :(得分:8)
.NET引用永远不会指向消失的对象;这就是GC的全部要点。您的示例描述了对单个对象的两个单独但相同的引用。更改一个引用不会改变任何其他引用。基本上你所描述的是:
int x = 1;
obj.Foo = x;
x = 0;
然后期望obj.Foo为0.它不会是:直到你改变它才会是1。参考文献的工作方式相同。
您没有“废弃”B
的实例。那个例子仍然非常开心。你刚刚删除了一个引用。
换句话说:在我的Facebook上,我将“Donna”列为我的妻子。如果我现在清楚那个领域(我没有计划做),我还没有删除她的帐户。
答案 1 :(得分:0)
如果A.F == null
为False
且A.F
为B
,则A.F
和B
引用相同的对象,该对象不为空。
如果您认为代码中B
此时应该为null,因为您之前将其设置为null,您的代码中可能会有另一个错误。