簡體   English   中英

C#對象范圍

[英]C# Object Scope

我試圖了解何時回收對象。 例如,在一個類中,我有一個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?

}

.NET中的垃圾收集器是不確定的。 一旦不再有對象引用,該對象即“准備收集”,但這並不意味着將立即收集該對象。

在您的代碼中, cameraList在其中包含名稱為“ Camera1”的對象,因為它引用了它,因此無論范圍如何,它都將阻止它被收集。

作用域是為變量而不是對象 對象是內存中的引用,而變量只是指向這些引用的指針。 您會丟失變量tempCamera ,但不會丟失它指向的對象

簡單地說:變量只是對象的指針(“引用”)。 盡管變量可能超出范圍,但是如果另一個變量或對象(例如您的列表)持有對該對象的引用,則不會對該對象進行垃圾回收。

因為盡管存在CameraTest ,但它引用了cameraList 存在cameraList時,它引用已添加到集合中的Camera所有實例。

您添加的攝像機1實例CameracameraList 因此,存在一系列引用,可以防止GC收集Camera1直到沒有人持有對CameraTest實例的引用CameraTest

您應該通過C#獲取CLR副本並閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM