说我有以下课程......
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()我会得到一个例外,例如“对象引用没有设置为对象的实例”......
答案 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
本身。它只是对它的引用。 myFavoriteFoo
和myClass.myList
都是引用到ArrayList。
因此,所有类都可以将自己的引用设置为null。但这并没有删除ArrayList。这只意味着对它的引用少了一些。
但只要至少有一个引用,就不会删除ArrayList。所以你描述的情况永远不会发生。
答案 5 :(得分:0)
myFavoriteFoo是另一个(除了数组之外)对您的对象的引用。只要引用处于活动状态,对象就不会被垃圾回收。因此,从Class1中的数组中删除元素不会影响myFavoriteFoo引用 - 它仍然存在。另一方面,如果对象在Class1中被处理(通过dispose / close调用),那么如果你试图使用它的方法你可能会得到错误 - 错误就像那个对象已经被处理掉了。