c#对象范围
本文关键字:范围 对象 | 更新日期: 2023-09-27 18:07:48
我想知道一个对象是什么时候被回收的。例如,在一个类中,我有一个List声明和一个方法,通过声明和初始化一个临时对象,然后将该对象添加到列表中来填充列表。
我的困惑:由于临时对象是在方法体中声明的,当方法返回时,这些对象不会被回收,因此保存对它们的引用的列表现在失去了它们的对象值吗?在方法完成后,我的代码仍然保持对象值(可能引用完整)。
public class CameraTest
{
private List <Camera> cameraList;
public CameraTest()
{
AddCamera();
}
private void AddCamera()
{
Camera tempCamera = new Camera();
tempCamera.Name="Camera1";
cameraList.Add(tempCamera);
}
//Why would cameraList still have the "Camera1" object here?
}
. net中的垃圾收集器是不确定的。一旦对象不再被引用,它就"准备好收集了",但这并不意味着它将立即被收集。
在你的代码中,cameraList
有一个名为"Camera1"的对象,因为它引用了它,所以它阻止了它被收集,无论作用域是什么。
作用域是指变量,而不是对象。对象是内存中的引用,而变量只是指向这些引用的指针。您丢失了变量tempCamera
,但没有丢失它指向的对象
简单地说:变量只是指向对象的指针("引用")。虽然变量可能超出作用域,但如果另一个变量或对象(例如列表)保存对同一对象的引用,则该对象不会被垃圾收集。
因为,当CameraTest
存在时,它引用了cameraList
。当cameraList
存在时,它引用已添加到集合中的Camera
的所有实例。
将Camera
的Camera1实例添加到cameraList
。所以有一个引用链可以防止Camera1被GC 收集,直到没有人持有对CameraTest
实例的引用。
你应该获取一个CLR Via c#的副本并阅读它