1

这很容易,我敢肯定。我试图寻找,但没有快乐。

假设我有一个 type 的对象,它有一个typeA的公共字段。我创建一个实例并设置.FBBA.F=B

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

但是然后B设置为null。该A.F属性仍然持有旧实例的句柄B。并且运行时查找A.F仍将其显示为 type B。所以测试A.F == null仍然给出 False,测试A.F is B仍然给出 True。虽然B已经被废了。

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

4

2 回答 2

8

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

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

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

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

换句话说:在我的 Facebook 上,我将“Donna”列为我的妻子。如果我现在清除该字段(我没有计划这样做),我还没有删除她的帐户。

于 2013-01-05T10:07:48.920 回答
0

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

于 2013-01-05T15:03:57.620 回答