2015-01-14 2 views
0

Код выглядит следующим образом.Как сборщик мусора выпускает память в C#

public class clsMisc : IDisposable { 
    List<clsEmployee> lst = new List<clsEmployee>(); 

    void Add(){ 
    lst.Add(obj); 
    //Adding to it list here 
    } 

    public void Dispose() 
    { 
    lst = null; 
    } 

} 

выше класс называется так,

Using(clsMisc obj = new clsMisc()){ 
//Here goes the code 
} 

, когда он выходит из сферы, используя метод Dispose в clsMisc называеться и в этом мы присвоили нуль.

Будут ли выпущены значения, сохраненные в памяти (существующие записи clsEmployee в списке), и назначит новое значение, или создаст новый экземпляр List и присвоит значение null?

Я не мог понять поведение, так как я очень новый.

Может ли кто-нибудь помочь мне в этом?

+0

1.You не нужно устанавливать '' lst' в null'. 2.Что именно ваш вопрос? Получает ли объект GC'd после выполнения инструкции using? или разные? –

+0

После того, как вы установили нулевое значение, что произойдет? – shanmugharaj

+0

Ничего не произойдет сразу. Но если это единственная ссылка на экземпляр, который вы установили в null. Это означает, что больше нет управляемых ссылок на объект, он имеет право на сбор мусора. GC будет собирать его, когда триггеры сбора мусора. –

ответ

2

Вы не должны беспокоиться об этом вообще, так как коллекционер довольно умный и потому что это управляемый язык, вы действительно должны его допускать.

Коллекционер решит, когда ему нужно сделать очистку, чтобы он не гарантировался, когда он выполнит свою работу.

НО, если вы решительно настроены на форсирование коллекции, вы можете позвонить GC.Collect

+0

В принципе, не беспокойтесь об утилизации на C#, если класс играет с другими объектами. Вы только хотите использовать IDisposable, когда класс владеет ресурсами «Native». –

+1

@ RichardSchneider Не только это. Если в вашем классе есть какое-либо поле, которое реализует 'IDisposable', вы должны реализовать' IDisposable' –

+0

Привет, спасибо за ответ. Я понял. – shanmugharaj