Если единственная цель класса состоит в том, чтобы инкапсулировать некоторый ресурс (*), который необходимо очистить, если его оставить, у него не должно быть финализатора, и Dispose (bool) никогда не должен вызываться со значением False,но вызов Dispose (False) не должен иметь никакого эффекта.Если унаследованный класс должен содержать ресурс, требующий очистки, если его оставить, он должен инкапсулировать этот ресурс в объект, предназначенный исключительно для этой цели.Таким образом, если основной объект покинут, и никто больше не имеет ссылки на объект, инкапсулирующий ресурс, этот объект может выполнить его очистку без необходимости поддерживать основной объект живым в течение дополнительного цикла GC.
Кстати,Мне не нравится обработка Microsoft флага Disposed.Я хотел бы предложить, чтобы не виртуальный метод Dispose использовал целочисленный флаг с Interlocked.Exchange, чтобы гарантировать, что вызов Dispose из нескольких потоков приведет к тому, что логика dispose будет выполнена только один раз.Сам флаг может быть закрытым, но должно быть защищенное и / или открытое свойство Disposed, чтобы не требовалось, чтобы каждый производный класс реализовывал свой собственный флаг удаления.
(*) Ресурс не является каким-то конкретным типомсущность, а скорее свободный термин, который включает в себя все, что класс, возможно, попросил какую-то внешнюю сущность сделать от его имени, что нужно сказать этой внешней сущности, чтобы прекратить делать.Обычно внешняя сущность предоставляет классу исключительное использование чего-либо (будь то область памяти, блокировка, дескриптор GDI, файл, сокет, USB-устройство или что-то еще), но в некоторых случаях внешняяСущность, возможно, попросили утвердительно что-то сделать (например, запускать обработчик событий каждый раз, когда что-то происходит) или держать что-то (например, объектно-статическую ссылку на объект).«Неуправляемый» ресурс - это ресурс, который не будет очищен в случае его отмены.
Кстати, обратите внимание, что, хотя Microsoft и предполагала, что объекты, инкапсулирующие неуправляемые ресурсы, должны очищать их в случае их отказа, существуют некоторые типы ресурсов.для которого это действительно не практично.Рассмотрим объект, который хранит ссылку на объект, например, в статическом поле потока, и удаляет эту ссылку на объект, когда он имеет значение Dispose (удаление, естественно, должно произойти в потоке, в котором был создан объект).Если объект покинут, но поток все еще существует (например, в пуле потоков), цель статической ссылки потока может легко поддерживаться бесконечно долго.Даже если нет никаких ссылок на заброшенный объект, поэтому его метод Finalize () выполняется, для оставленного объекта будет трудно найти и уничтожить статическую ссылку на поток, находящуюся в каком-то потоке.