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 的所有实例。

您已将 CameraCamera1 实例添加到 cameraList。所以有一个引用链将阻止 Camera1 被 GC 收集,直到没有人持有对 CameraTest 实例 的引用。

您应该获取一份 CLR Via C# 并阅读它。