1.Что делает SuppressFinalize?
Он отменяет регистрацию объекта в списке финализатора, т.е. когда GC позднее собирает объект, он игнорирует присутствие деструктора.Это большой выигрыш в производительности, так как в противном случае деструктор потребовал бы задержки объекта коллекции и всего, на что он ссылается.
2.Почему мы не располагаем [управляемым] ресурсом на этом этапе?Другими словами, почему мы не можем освободить [управляемые] ресурсы с помощью деструктора?
Можно, но это точно бессмысленно: объект, в котором вы находитесь, стал недоступным, поэтому все принадлежащие им управляемые ресурсытоже недостижим.Они будут финализированы и собраны GC в том же прогоне, и вызов Dispose () для них не нужен, но не полностью без риска или затрат.
2a Какой код должен выполняться в if внутри,и что за пределами?
Внутри if(disposing)
, вызовите _myField.Dispose()
Другими словами, Утилизируйте управляемых ресурсов (объекты с Dispose)
Снаружи, вызовите код для очистки (закрытия) неуправляемых ресурсов, таких как Win32API.Close(_myHandle)
.
Обратите внимание, что когда у вас нет неуправляемых ресурсов, как это обычно бываетслучай (ищите SafeHandle), вам не нужен деструктор и, следовательно, не SuppressFinalize.
И это означает, что полная (официальная) реализация этого шаблона необходима только из-за возможности наследования Test от.
Обратите внимание, что Dispose(bool)
защищен.Когда вы объявляете тестирование в классе sealed
, совершенно безопасно и не допускать ~Testing()
.