Почему анализаторы кода рекомендуют удалять поля IDisposable?

Например, есть класс:

public class MyClass{
   Bitmap bmp;
}

Класс Bitmap является одноразовым.

В случае, когда я не реализую IDisposable в MyClass и нет ссылок на экземпляр MyClass, это означает, что нет ссылок на экземпляр класса Bitmap, поэтому GarbageCollector вызовет финализатор Bitmap и все неуправляемые ресурсы будут освобождены.

Почему анализаторы кода рекомендуют реализовать IDisposable в MyClass?


person Eugene Maksimov    schedule 26.08.2014    source источник
comment
Да, он будет собран в какой-то момент, просто не детерминировано.   -  person leppie    schedule 26.08.2014
comment
habrahabr.ru/post/89720 (ресурс на русском, увы)   -  person Dmitry Bychenko    schedule 26.08.2014
comment
@DmitryBychenko Есть такая штука, как Google Translate -- Или бесплатный браузер со встроенным! (Google Chrome) :)   -  person Cullub    schedule 26.08.2014


Ответы (2)


Есть 2 причины для реализации IDispose:
1. Утилизация неуправляемых ресурсов — это то, ЧТО очищать (неуправляемые ресурсы)
2. Чтобы иметь возможность контролировать, когда управляемые ресурсы освобождены - речь идет о том, КОГДА вещи очищаются.
Документация IDisposable очень сильно фокусируется на 1. но в действительности большинство реализаций относится к 2.
Это имеет место в вашем случае. пример - ресурсы, которые у вас есть, управляются (управляемым классом растрового изображения, который обертывает дескриптор неуправляемого растрового изображения). Вы бы разместили его в своем распоряжении, чтобы пользователи вашего класса могли контролировать, когда растровое изображение было освобождено (НЕ, если оно будет освобождено - в конечном итоге это произойдет, когда GC захочет).

person Ricibob    schedule 26.08.2014

Может быть, так и будет. Но когда? Этот класс нельзя надежно использовать. Если я создам 10 000 последовательно, 10 000 нераспределенных растровых изображений будут в памяти, ожидая, пока ленивый сборщик мусора вызовет финализатор, чтобы (надеюсь) вызвать Dispose. Может быть сегодня. Может быть завтра. Но как разработчик я не могу это контролировать. Если вы реализуете IDisposable правильно, я могу просто иметь блок using вокруг каждого из них, и я никогда не буду использовать больше ресурсов, чем потребуется для одного Bitmap.

person nvoigt    schedule 26.08.2014
comment
просто для уточнения: вы даже не можете контролировать это, заставляя GC собирать? - person ; 26.08.2014
comment
@AndreasNiedermair Может быть, ты сможешь. Но принуждение сборщика мусора к сборке — это прямая противоположность сборке мусора. И если OP даже не реализует IDisposable, как мы узнаем, нужно ли нам вообще вызывать GC.Collect? Вы не можете вызывать GC.Collect каждый другой оператор на тот случай, если OP неправильно запрограммировал стороннюю библиотеку. - person nvoigt; 26.08.2014
comment
это очень ясно для меня;) просто для пояснения (и, возможно, подсказка для ОП) - person ; 26.08.2014