Нужно ли освобождать частные поля интерфейса в .NET? - PullRequest
0 голосов
/ 03 февраля 2011

Насколько я понимаю, интерфейсный ресурс освобождается, когда счетчик ссылок на интерфейсе достигает 0.

Рассмотрим следующее приватное поле:

private IMyInterface _field = new DisposableObject()

Должен ли я все еще явно освобождать это поле в классе, например сделать класс реализованным IDisposable и освободить его на Dispose? Или он будет освобожден автоматически, потому что я использую интерфейс?

У меня была похожая ситуация в Delphi, и это вызывало утечку памяти, что немного смущало меня, так как я всегда думал, что сопряженные объекты не нужно освобождать (так как они подсчитываются). Чтобы исправить утечку памяти, мне пришлось хранить конкретный тип и освобождать его при уничтожении.

Полагаю, что я на самом деле понимаю, это , почему мне нужно освободить его, если я использую интерфейс?

Ответы [ 5 ]

3 голосов
/ 03 февраля 2011

Полагаю, что я на самом деле понимаю, зачем мне освобождать его, если я использую интерфейс?

Интерфейс только говорит вам , как правильно распоряжаться ресурсом, а не , когда делает это. Ты должен решить это сам.

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

1 голос
/ 03 февраля 2011

.NET не использует подсчет ссылок для определения того, когда ресурсы собираются мусором.Объекты будут собираться, когда в программе нет живых ссылок на объект.Это делается путем обхода графов объектов вместо подсчета ссылок, поэтому циклические ссылки не пропускают ресурсы.

Если класс с неуправляемыми ресурсами кодируется правильно, то вызов Dispose будет необязательным.Ресурсы будут очищены в финализаторе, когда сборка мусора произойдет независимо.

Dispose не влияет на время жизни объекта.Это будет сборка мусора через некоторое время после того, как не останется живых ссылок на объект.

Время жизни объекта также не зависит от того, относится ли переменная, на которую он ссылается, к интерфейсу или типу объекта.Установка переменной в null удалит действующую ссылку и - если нет других ссылок на объект - позволит объекту быть собранным.

1 голос
/ 03 февраля 2011

Если ваш класс содержит одноразовые поля, которые управляются вашим классом - я имею в виду, что они не определены в вашем классе - тогда ваш класс должен также реализовать интерфейс IDisposable.

Если вы не утилизируете Одноразовые объекты, как только они вам больше не нужны, вы не уверены, когда объекты будут удалены.

0 голосов
/ 03 февраля 2011

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

Интерфейс или нет, вы создали объект, поэтому вы (в общем) несете ответственность за его очистку. Так как он одноразовый, это путь.

Утечки памяти в классическом смысле практически невозможны из-за сборки мусора, но одноразовые объекты обычно имеют дело с другими ресурсами (такими как файлы, соединения с базой данных, COM-объекты и т. Д.), Поэтому утечки ресурсов все еще возможны.

0 голосов
/ 03 февраля 2011

Использование интерфейсов не означает, что вам не нужно применять правильные методы утилизации.

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