Если вы на самом деле держите неуправляемые ресурсы, которые не будут автоматически очищаться сборщиком мусора и очищать их в вашем Dispose (), тогда да, вы должны сделать то же самое в Finalize ().
Если вы внедряете IDisposable по какой-либо другой причине, реализация Finalize () не требуется.
Основной вопрос заключается в следующем: если Dispose () не был вызван и ваш мусор собрал объект, произойдет ли утечка памяти? Если да, внедрите Finalize. Если нет, вам не нужно. Также избегайте реализации Finalize «только потому, что это безопаснее». Для объектов с пользовательскими финализаторами потенциально могут потребоваться два прохода GC, чтобы освободить их - один, чтобы поместить их в очередь ожидающих финализаторов, и второй проход, чтобы фактически освободить их память.