Область применения объекта C#

Я пытаюсь понять, когда объект перерабатывается. Например, в классе у меня есть объявление 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?

}

3 ответа

Решение

Сборщик мусора в.NET недетерминирован. Объект "готов к сбору", если на него больше нет ссылок, но это не значит, что он будет собран сразу.

В вашем коде cameraList содержит объект с именем "Camera1", потому что он ссылается на него, поэтому он предотвращает его сбор, независимо от области видимости.

Область предназначена для переменных, а не для объектов. Объекты - это ссылки в памяти, а переменные - просто указатели на эти ссылки. Вы теряете переменную tempCamera, но не объект, на который он указывает

Проще говоря: переменная - это просто указатель ("ссылка") на объект. Хотя переменная может выйти из области видимости, если другая переменная или объект (например, ваш список) содержит ссылку на этот же объект, этот объект не будет собираться мусором.

Потому что пока CameraTest существует, это ссылки cameraList, В то время как cameraList существует, он ссылается на все экземпляры Camera которые были добавлены в коллекцию.

Вы добавили экземпляр Camera1 Camera в cameraList, Таким образом, существует цепочка ссылок, которые не позволят сборщику Camera1 быть собранным GC, пока никто не удержит ссылку на CameraTest экземпляр.

Вы должны зацепить копию CLR через C# и прочитать ее.

Другие вопросы по тегам