Finalizer вызывается GC недетерминированно для аварийного освобождения unmanaged; Dispose — явный и своевременный путь.
Разбор
- Finalizer замедляет сборку и усложняет код.
- Реализуйте Dispose-паттерн, если нужен finalizer.
- GC.SuppressFinalize после Dispose.
- В современном коде finalizer редок.
Итог
Dispose детерминирован; finalizer — последний рубеж для unmanaged.