在C#中,当我有两个对象obj1、obj2,它们都由一个List组成,并且我将这两个对象都赋值给同一个List对象时。如果我的对obj1的引用超出了范围,但对obj2的引用没有超出范围,那么obj1是否仍然符合垃圾回收的条件,或者是否存在某些依赖关系,因为仍然存在对List对象的引用?
只要没有对obj1本身的引用,obj1就应该有资格进行垃圾回收。
obj1
定义的指针,而不是被obj1
指向的List<string>
实例,则这是正确的。 - Enigmativityobj1
和obj2
引用同一个对象。因此它不符合收集条件。 - Enigmativity这个问题中定义了三种内存使用方式:
obj1
是单个List<string>
实例的引用。obj2
是单个List<string>
实例的引用。List<string>
实例本身。如果obj1
超出作用域,但obj2
没有,那么垃圾回收后仅剩下以下内容:
obj2
所引用的List<string>
实例。List<string>
实例本身。重要的是要记住,在大多数情况下,C#抽象了引用的概念,因此您可以安全地将obj1
和obj2
视为List<string>
而不是引用,但它们确实是引用。
很可能obj1
引用在本地调用堆栈中,而不是实例本身,实例本身很可能在堆上。因此,当调用堆栈被展开时,obj1
(引用)才会被清除。
obj1
是列表的成员,则在父列表被垃圾回收之前,它将不会被垃圾回收。因此:List<string> l = new List<string>();
string a = "one";
l.Add(a);
{
string b = "two";
l.Add(b);
}
a
在作用域内,b
不在作用域内,但两者仍然在列表l
中具有引用,因此两者都不符合垃圾回收的条件。
var list = new List<string>(); object obj2 = list; { object obj1 = list; }
。垃圾回收不影响变量。它影响对象。obj1
和obj2
不会被垃圾回收。它们存在于堆栈上,并在函数或方法返回时清除。首先分配给list
的实例是唯一真正的对象,只有在所有对它的引用都被销毁(通过超出范围或垃圾回收)之后,才能进行垃圾回收。 - bambams