C# 对象作用域
C# Object Scope
我正在尝试了解对象何时被回收。例如,在 class 中,我有一个 List 声明和此 class 中的一个方法,通过声明和初始化临时对象然后将此对象添加到列表来填充列表。
我的困惑:由于临时对象是在方法体内声明的,所以当方法 returns 时这些对象是否会被回收,因此持有对它们的引用的列表现在失去了它们的对象值?方法完成后,我的代码仍然保留对象值(并且可能引用完好无损)。
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 中的垃圾收集器是不确定的。一个对象是 "ready for collection" 一旦不再有对它的引用,但这并不意味着它会立即被收集。
在您的代码中,cameraList
中包含名称为 "Camera1" 的对象,因为它引用了它,因此它阻止了它被收集,无论范围如何。
作用域适用于变量,不适用于对象。对象是内存中的引用,而变量只是指向这些引用的指针。您丢失了变量 tempCamera
,但没有丢失它指向的对象
简单地说:变量只是指向对象的指针("reference")。虽然一个变量可能超出范围,但如果另一个变量或对象(例如您的列表)持有对同一对象的引用,则该对象将不会被垃圾回收。
因为,虽然 CameraTest
存在,但它引用了 cameraList
。虽然 cameraList
存在,但它引用了已添加到集合中的 Camera
的所有实例。
您已将 Camera
的 Camera1 实例添加到 cameraList
。所以有一个引用链将阻止 Camera1 被 GC 收集,直到没有人持有对 CameraTest
实例 的引用。
您应该获取一份 CLR Via C# 并阅读它。
我正在尝试了解对象何时被回收。例如,在 class 中,我有一个 List 声明和此 class 中的一个方法,通过声明和初始化临时对象然后将此对象添加到列表来填充列表。
我的困惑:由于临时对象是在方法体内声明的,所以当方法 returns 时这些对象是否会被回收,因此持有对它们的引用的列表现在失去了它们的对象值?方法完成后,我的代码仍然保留对象值(并且可能引用完好无损)。
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 中的垃圾收集器是不确定的。一个对象是 "ready for collection" 一旦不再有对它的引用,但这并不意味着它会立即被收集。
在您的代码中,cameraList
中包含名称为 "Camera1" 的对象,因为它引用了它,因此它阻止了它被收集,无论范围如何。
作用域适用于变量,不适用于对象。对象是内存中的引用,而变量只是指向这些引用的指针。您丢失了变量 tempCamera
,但没有丢失它指向的对象
简单地说:变量只是指向对象的指针("reference")。虽然一个变量可能超出范围,但如果另一个变量或对象(例如您的列表)持有对同一对象的引用,则该对象将不会被垃圾回收。
因为,虽然 CameraTest
存在,但它引用了 cameraList
。虽然 cameraList
存在,但它引用了已添加到集合中的 Camera
的所有实例。
您已将 Camera
的 Camera1 实例添加到 cameraList
。所以有一个引用链将阻止 Camera1 被 GC 收集,直到没有人持有对 CameraTest
实例 的引用。
您应该获取一份 CLR Via C# 并阅读它。