C# C对象范围

C# C对象范围,c#,object,reference,recycle,C#,Object,Reference,Recycle,我在试着理解一件物品何时被回收。例如,在一个类中,我在这个类中有一个列表声明和一个方法,通过声明和初始化一个临时对象,然后将这个对象添加到列表中来填充列表 我的困惑是:既然临时对象是在方法体中声明的,那么当方法返回时,这些对象不会被循环使用吗?因此,包含对它们的引用的列表现在会丢失它们的对象值吗?我的代码在方法完成后仍然保持对象值和引用完好无损 public class CameraTest { private List <Camera> cameraList; p

我在试着理解一件物品何时被回收。例如,在一个类中,我在这个类中有一个列表声明和一个方法,通过声明和初始化一个临时对象,然后将这个对象添加到列表中来填充列表

我的困惑是:既然临时对象是在方法体中声明的,那么当方法返回时,这些对象不会被循环使用吗?因此,包含对它们的引用的列表现在会丢失它们的对象值吗?我的代码在方法完成后仍然保持对象值和引用完好无损

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中的垃圾收集器是不确定的。一个对象一旦没有更多的引用就可以被收集,但这并不意味着它会被立即收集

在您的代码中,cameraList包含名为Camera1的对象,因为它引用了该对象,所以它阻止收集该对象,无论其作用域如何


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

简单地说:变量只是指向对象的指针引用。虽然一个变量可能超出范围,但如果另一个变量或对象(如列表)包含对该对象的引用,则不会对该对象进行垃圾收集。

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

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


您应该通过C获取一份CLR副本并阅读。

如果您包含可以实际编译的代码,您的问题会更好,您已将变量cameraList创建为类上的全局变量。只要您有CameraTest的实例,并且找到更好的地方调用AddCamera(即在构造函数中),对象将仍然存在。仅当引用计数为0时,才会发生垃圾回收,一个对象存在并继续存在,只要有人在技术上对它有引用,它仍然存在,直到它被GC’ed。变量tempCamera在AddCamera方法之外不存在,但是您分配给它然后添加到cameraList的对象会这样做,因为cameraList有一个对它的引用。一个对象一旦不再有不正确的引用,就可以进行收集。如果是的话,您可以在.net中拥有隔离岛。相反,您可能想编写一个对象,当它不再是根对象时,它就可以被收集了。所有提供的答案都是有意义的,但您的变量与对象语句将重点放在了这里。@ConradFrix您当然是对的,但接下来您必须解释GC根对象的概念以及GC如何工作的强化课程,我想对于这样的问题,这个答案太长了。我试着让它变得简单:再说一遍,你是对的,如果OP想进一步挖掘,我会推荐,但我想简单但不完全正确的解释足以启动变量只是一个指针,这对所有变量都是正确的吗?@Conrad不,这就是我说的简单的原因。From:值类型的变量存储数据,引用类型的变量存储对实际数据的引用。参照类型也称为对象。