C# .NET,如何确定字段是否已为空

C# .NET,如何确定字段是否已为空,c#,memory-management,garbage-collection,C#,Memory Management,Garbage Collection,我相信这很简单。我试着寻找,但没有快乐 假设我有一个A类型的对象,它有一个B类型的公共字段F。我创建了B的一个实例,并设置A.F=B A.F==null的结果为False。 A.F的结果为B为真 但是B设置为空。A.F属性仍然保留B的旧实例的句柄。而A.F的运行时查找仍将其显示为B类型。因此测试A.F==null仍然给出False,测试A.F是B仍然给出True。即使B已被销毁 那么,如何检查A.F属性以查看其句柄现在是否指向消失的对象?A.NET引用从不指向消失的对象;这就是GC的全部要点。您

我相信这很简单。我试着寻找,但没有快乐

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

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

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


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

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

 int x = 1;
 obj.Foo = x;
 x = 0;
然后期望obj.Foo为0。它不会是:除非你改变它,否则它将是1。参考文献的作用相同

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


换句话说:在我的脸书上,我把“唐娜”列为我的妻子。如果我现在清除该字段(我没有计划这么做),我就没有删除她的帐户。

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

 int x = 1;
 obj.Foo = x;
 x = 0;
然后期望obj.Foo为0。它不会是:除非你改变它,否则它将是1。参考文献的作用相同

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


换句话说:在我的脸书上,我把“唐娜”列为我的妻子。如果我现在清除了那个字段(我没有计划这么做),我就没有删除她的帐户。

如果
A.F==null
False
并且
A.F
B
,那么
A.F
B
引用的是同一个对象,而不是null。
如果您认为代码中的
B
此时应该为null,因为您以前将其设置为null,那么代码中可能存在另一个bug。

如果
A.F==null
False
A.F
B
,则
A.F
B
引用的对象不是null。
如果您认为代码中的
B
此时应该为null,因为您以前将其设置为null,那么您的代码中可能还有另一个bug。

天哪,我觉得自己很愚蠢。是的,仍然有一个指向它的指针,因此它被保留。有没有办法将指向某个对象的所有指针都丢弃?我现在正在使用代码,所以对象B必须保留一个所有引用的列表。所以当我摧毁B时,它会去掉所有的指针。这意味着,每当我设置对B的引用时,我必须确保我调用了B内部的一个方法,以便B可以记录该引用。@David不,没有办法这么做。天哪,我觉得自己很愚蠢。是的,仍然有一个指向它的指针,因此它被保留。有没有办法将指向某个对象的所有指针都丢弃?我现在正在使用代码,所以对象B必须保留一个所有引用的列表。所以当我摧毁B时,它会去掉所有的指针。这意味着每当我设置对B的引用时,我必须确保我在B中调用了一个方法,以便B可以记录该引用。@David不,没有办法这样做。