C#对象范围

时间:2015-08-12 15:28:14

标签: c# object reference recycle

我正在尝试了解何时回收对象。例如,在类中,我有一个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?

}

3 个答案:

答案 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副本并阅读它。