Просто внимательно прочтите шаблон IDisposable
, чтобы понять, что означают эти «разделы» и когда они будут выполнены.
TL; DR
Вы не используете любые существующие ссылки на управляемые объекты вне блока if (disposing)
. В вашем примере tempFilePaths
кажется полем / свойством типа IEnumerable<string>
, которое является управляемым объектом (существующей ссылкой). Таким образом, единственное правильное место для доступа / использования - внутри блока if (disposing)
.
Причина
Код за пределами if (disposing)
запускается оба при вызове метода publi c Dispose()
и при вызове финализатором.
Финализатор будет вызываться в специальном потоке финализатора. Не гарантируется, что во время вызова финализатора tempFilePaths
будет вообще доступен. Он мог быть уже собран G C, несмотря на то, что ссылка на объект содержится в экземпляре вашего класса. Вот как работают финалисты.
Если вы хотите получить больше информации и больше аргументов во время обсуждения с вашей командой, пожалуйста, внимательно прочтите эти сообщения в блоге Эри c Липперта (бывшего члена команды C# компилятора) о финализаторы:
Когда все, что вы знаете, неверно, часть первая
Когда все, что вы знаете, неверно, часть вторая