Если Dispose (false) ничего не собирается делать, это очень хороший признак того, что ни ваш класс, ни какой-либо класс, производный от него, не должны включать в себя «деструктор» в стиле C # и не переопределять Finalize, а также аргумент «утилизация»должен рассматриваться как фиктивный, цель которого - дать защищенному методу Dispose другую подпись, чем общедоступная.
Обратите внимание, что реализация деструктора или переопределение Finalize в производном классе, когда родительский класс не ожидает такогоповедение, может производить Гейзенбагс.Среди прочего, GC может иногда решить, что объект класса был заброшен, вызывая его финализатор / деструктор, даже когда используется объект, на который ссылается поле класса.Например, предположим, что статический класс usbThingie
управляет USB-контроллерами с помощью целочисленных дескрипторов, а класс-оболочка usbWrapper
делает что-то вроде:
UInt32 myHandle;
void sendData(Byte data[])
{
UsbThingie.send(myHandle, data[0], data.Length);
}
Если вызов sendData () является последним, что делается дляэкземпляр usbWrapper
до того, как он был оставлен, сборщик мусора мог бы заметить, что после вызова UsbThingie.send () - даже до его возврата - дальнейших ссылок на usbWrapper
не будет, итаким образом это может безопасно вызвать финализатор.Если финализатор попытается закрыть канал, на который указывает myHandle
, это может нарушить передачу, которая имела место;если usbThingie не является поточно-ориентированным, неизвестно, что может произойти.