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?
}

c#对象范围

. net中的垃圾收集器是不确定的。一旦对象不再被引用,它就"准备好收集了",但这并不意味着它将立即被收集。

在你的代码中,cameraList有一个名为"Camera1"的对象,因为它引用了它,所以它阻止了它被收集,无论作用域是什么。

作用域是指变量,而不是对象。对象是内存中的引用,而变量只是指向这些引用的指针。您丢失了变量tempCamera,但没有丢失它指向的对象

简单地说:变量只是指向对象的指针("引用")。虽然变量可能超出作用域,但如果另一个变量或对象(例如列表)保存对同一对象的引用,则该对象不会被垃圾收集。

因为,当CameraTest存在时,它引用了cameraList。当cameraList存在时,它引用已添加到集合中的Camera的所有实例。

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

你应该获取一个CLR Via c#的副本并阅读它