В 99% случаев среда Microsoft сильно усложняется, и правильный подход прост:
- Если в вашем классе есть какие-либо поля типов, реализующие IDisposable, и никто не собирается ожидать использованияКогда вы закончите с этими объектами, вы должны реализовать IDisposable, и ваш метод удаления должен вызвать Dispose для всех таких полей.
- Если в вашем классе нет таких полей, но вы думаете, что классы, производные от ваших, могут или если вашему классу требуется реализовать интерфейс, такой как IEnumerator (of T), для которого требуется IDisposable, у вас должен быть переопределяемый метод Dispose, который ничего не делает,
- Надлежащая семантика для метода «dispose» состоит в том, чтобы объект делал все необходимое для очистки других объектов до того, как от него отказались.Если объект не должен очищать другие объекты, утилизация не должна безвредно ничего не делать.Нет никаких причин для исключения NotImplementedException или NotSupportedException из Dispose.
Ключевым моментом при реализации IDisposable является не очистка какого-либо конкретного вида "ресурсов", а скорее обеспечение того, что если объект изменяет других объектов в системе таким образом, чтобыкогда-нибудь потребуется очистка, эти объекты будут очищены, пока информация и стимул, необходимые для этого, все еще существуют.В идеале эта очистка должна произойти как можно скорее, но не раньше.Если объект содержит, например, ничего, кроме набора строк, очистка не требуется.Строка не требует очистки;массив объектов, не требующих очистки, не требует никакой очистки, а объект, содержащий только объекты, не требующие очистки, также не требует очистки.С другой стороны, действие, такое как открытие сокета TCP, создает необходимость обеспечить выполнение определенного действия по очистке (закрытие сокета).Если объект открывает TCP-сокет и хранит информацию о нем, цель вызова Dispose для этого объекта состоит не в том, чтобы уничтожить информацию о сокете (об этом позаботится сборщик мусора), а в том, чтобы обеспечить необходимоевыполняется операция «close» в стеке TCP.