如果引用的对象被删除,Reference变量会发生什么?

时间:2010-08-12 11:45:20

标签: c# .net object reference

说我有以下课程......

Class1
{
  private ArrayList myList;

  private Class1
  {
    // Here fill myList with a bunch of Foo objects.
  }

  public ArrayList GetList()
  {
    return myList;
  }
}

然后在其他课程中说你有以下代码......

Class1 myClass = new Class1();
Foo myFavoriteFoo = myClass.GetList()[0] As Foo;

现在,myFavoriteFoo实际上是对Class1中arraylist中存在的Foo的引用。如果Class1中的某些内容从类中删除了特定的Foo或者将其丢弃,会发生什么? myFavoriteFoo会立即= null吗?我猜我是否试图访问Foo.SomeMethod()我会得到一个例外,例如“对象引用没有设置为对象的实例”......

6 个答案:

答案 0 :(得分:2)

答案是不可能发生。

dotNet提供类型安全性:引用始终指向有效实例,或者它为null,没有其他选项。这就是为什么dotNet中没有手动内存管理(没有删除)。

因此,如果您的代码在某个地方持有对象的引用,那么该引用会阻止它进行垃圾回收。

Dispose()是另一回事,它与没有与对象占用的内存有关。 Dispose()是(非托管)资源的清理,通常该对象将其内部状态设置为“无效”。

答案 1 :(得分:0)

如果 myFavoriteFoo之后对象的设置为null ,则myFavoriteFoo仍然保留引用。如果Foo正确实现IDisposable,那么如果在对象上调用Dispose()后尝试访问它,则会出现异常。

答案 2 :(得分:0)

当有引用指向它们时,不会删除引用对象(除了少数例外,您不必担心)。当原始引用超出范围时,另一个引用仍将指向您的对象,并且该对象将保持活动状态。删除第二个引用(通过将其设置为null,为其分配不同的值,或使其超出范围)后,GC可能会收集它(但不保证立即这样做)。

答案 3 :(得分:0)

首先,您需要阅读有关引用类型的信息。您可以尝试自己编写代码,看看如果你不懒惰会发生什么:)

真正的行为是,如果某人从列表中删除该对象,则并不意味着该对象已从内存中删除。垃圾收集器检查对象是否有引用,在您的情况下myFavoriteFoo保存引用,因此GC不会删除该对象。

如果处理 - 在C#中没有办法手动强制删除对象,即使你调用dispose或析构函数,垃圾收集器也会检查对象,只有对象有0个引用时才会删除对象

对于常规参考,这是正确的。同样在.Net中有类WeakReference,它会覆盖常规引用的规则。

答案 4 :(得分:0)

Class1不拥有ArrayList本身。它只是对它的引用。 myFavoriteFoomyClass.myList都是引用到ArrayList。

因此,所有类都可以将自己的引用设置为null。但这并没有删除ArrayList。这只意味着对它的引用少了一些。

但只要至少有一个引用,就不会删除ArrayList。所以你描述的情况永远不会发生。

答案 5 :(得分:0)

myFavoriteFoo是另一个(除了数组之外)对您的对象的引用。只要引用处于活动状态,对象就不会被垃圾回收。因此,从Class1中的数组中删除元素不会影响myFavoriteFoo引用 - 它仍然存在。另一方面,如果对象在Class1中被处理(通过dispose / close调用),那么如果你试图使用它的方法你可能会得到错误 - 错误就像那个对象已经被处理掉了。