Какой из них правильный?
Немного неприятный ответ "оба" ;-) ...
В идеале вы хотите, чтобы приведение в порядок происходило в методе Dispose, чтобы его можно было выполнить как можно скорее, но в некоторых ситуациях важно также вызывать код исправления из деструктора в качестве резервной копии на случай, если объект используется не будучи уничтоженным (... я думаю, это зависит от того, насколько вероятно вы думаете, что это может быть!?)
Шаблон dispose (упомянутый в других ответах) предоставляет способ реализовать это без дублирования кода между dispose и destructor, а с помощью GC.SupressFinalize гарантирует, что сборка мусора объекта не будет удерживаться без необходимости, если tidy было сделано.