[英]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實例Camera
到cameraList
。 因此,存在一系列引用,可以防止GC收集Camera1 , 直到沒有人持有對CameraTest
實例的引用CameraTest
。
您應該通過C#獲取CLR副本並閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.