我正在尝试了解何时回收对象。例如,在类中,我有一个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?
}
答案 0 :(得分:6)
.NET中的垃圾收集器是非确定性的。一个对象已准备好收集&#34;一旦没有更多的引用,但这并不意味着它会被立即收集。
在您的代码中,tempCamera
的对象名称为&#34; Camera1&#34;因为它引用它,所以它阻止它被收集,无论范围如何。
范围适用于变量,而不适用于对象。对象是内存中的引用,而变量只是指向这些引用的指针。您丢失了变量obj = S3_BUCKET.object('file_name')
obj.upload_file(File.expand_path(params[:file].tempfile))
,但没有丢失它指向的对象
答案 1 :(得分:3)
简单地说:变量只是对象的指针(&#34;引用&#34;)。虽然变量可能超出范围,但如果另一个变量或对象(例如列表)包含对同一对象的引用,则该对象不会被垃圾收集。
答案 2 :(得分:2)
因为,虽然存在for
,但它会引用CameraTest
。虽然cameraList
存在,但它引用了已添加到集合中的cameraList
的所有实例。
您已将Camera
的 Camera1 实例添加到Camera
。因此,有一系列参考文献会阻止GC 收集 Camera1 ,直到没有人拥有对cameraList
实例的引用。
你应该通过C#获取CLR副本并阅读它。