Как мне освободить объекты в C # - PullRequest
13 голосов
/ 09 марта 2010

Может кто-нибудь сказать, пожалуйста, как я могу освободить объекты в C #? Например, у меня есть объект:

Object obj1 = new Object();
//Some code using obj1
/*
Here I would like to free obj1, 
after it is no longer required 
and also more importantly 
its scope is the full run time of the program.
*/

Спасибо за вашу помощь

Ответы [ 9 ]

18 голосов
/ 09 марта 2010

Вам не нужно. Сборщик мусора во время выполнения придет и очистит его для вас. Вот почему вы используете C #, а не неуправляемый C ++, во-первых:)

7 голосов
/ 09 марта 2010

Вы нет. Это то, что делает сборщик мусора автоматически - в основном, когда среде выполнения .NET требуется память, он обходит и удаляет объекты, которые больше не используются.

То, что вам нужно сделать, чтобы это работало, это удалить все линки с объекта.

В вашем случае ....

obj1 = NULL;

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

Вы можете проверить http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) для более подробной информации.

Обратите внимание, что если объект имеет ссылки на неуправляемые ресурсы (например, открытые файлы и т. Д.), Он должен реализовать шаблон Disposable (интерфейс IDisposable), и вы должны явно освобождать эти ссылки, когда вам больше не нужен объект.

7 голосов
/ 09 марта 2010

Вам не нужно. Вы просто перестаете ссылаться на них, и сборщик мусора (в какой-то момент) освободит их для вас.

Вы должны реализовать IDisposable для типов, которые используют неуправляемые ресурсы, и обернуть любой экземпляр, который реализует IDisposable, в оператор using.

5 голосов
/ 09 марта 2010

Это не рекомендуется, но если вам действительно нужно, вы можете принудительно собрать мусор с помощью:

GC.Collect();
2 голосов
/ 09 марта 2010

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

0 голосов
/ 26 октября 2017

GC будет собирать все ресурсы, кроме неуправляемых.

Неуправляемые ресурсы должны реализовывать IDisposable. Если вы используете объект, который реализует IDisposable, то вам следует либо вызвать метод Dispose() объекта, когда он больше не нужен, или заключить его экземпляр в оператор using.

0 голосов
/ 09 марта 2010

Как отметил Крис, C # выполняет большую часть сборки мусора для вас. Случаи, когда вам необходимо учитывать сборку мусора, связаны с реализацией интерфейса IDisposable и при использовании WeakReference. См. http://msdn.microsoft.com/en-us/library/system.idisposable.aspx и http://msdn.microsoft.com/en-us/library/system.idisposable.aspx для получения дополнительной информации.

0 голосов
/ 09 марта 2010

Как уже упоминали другие, вам не нужно явно освобождать их; однако кое-что, что не было упомянуто, - то, что, хотя это верно, встроенный сборщик мусора освободит их для вас, нет никакой гарантии, КОГДА сборщик мусора освободит это.

Все, что вы знаете, это то, что когда он выходит из области видимости, он МОЖЕТ быть очищен ГХ, и на каком-то этапе это произойдет.

0 голосов
/ 09 марта 2010

Вы перестаете ссылаться на них и позволяете сборщику мусора забирать их.

Если вы хотите освободить объект, добавьте следующую строку:

obj1 = null;

Сборщик мусора, если он свободен для удаления объекта (при условии, что нет другого указателя на объект, который поддерживает его.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...