2012-06-28 2 views
1

У меня есть следующий код:StreamWriter внутри Dispose

 public void Dispose() 
     { 
      bool append = true; 
      using(var log = new System.IO.StreamWriter("log.txt", append)) 
      { 
       log.WriteLine("Disposing"); 
       log.Flush(); 
      } 
     } 

Таким образом, есть риск того, что StreamWriter может выбросить исключение, было бы это означать, что мой объект не получил бы утилизировать? Просто обертывание этого в Try/Catch решит проблему?

Спасибо.

+1

Я не уверен в этом ответе на сообщение в поле ответов, но я считаю, что ваш объект все равно будет размещен, как и любой управляемый объект, просто остальная часть вашего метод dispose не будет работать. –

+0

чего вы пытаетесь достичь? Dispose/IDisposable используется для освобождения неуправляемых ресурсов, отсутствующих в методе Dispose. Выполняется только ведение журнала – Tilak

+0

Это всего лишь пример случая, когда ошибка может возникнуть внутри Dispose, и именно так мне задавали вопрос в интервью, поэтому, как я опубликовал его. – Richard

ответ

3

Это зависит от того, что вы имеете в виду под этим:

бы, то значит, что мой объект не получил бы утилизировать?

Ваш объект был Dispose призвал его, в противном случае он бы не достиг StreamWriter кода. Возможно, что вызов Dispose не завершен, но не похоже, что на объекте есть какой-то волшебный флаг, говорящий «расположен или не расположен».

Обратите внимание, что удаление логически отделить от сбора мусора и завершения: ваш объект будет все еще иметь право на сбор мусора точно так же, как обычно (если нет живых ссылок), и если у вас есть финализации (почти наверняка не очень хорошая идея), он все равно будет вызван, если вы его не подавили.

Важно понимать, что хотя C# поддерживает IDisposable на уровне языка, CLR действительно не заботится об этом. Это просто другой интерфейс, и Dispose - это еще один метод.

В общем, это плохая идея для Dispose, чтобы выбросить исключение (как если бы объект был удален как часть очистки существующей неудачной операции, вы теряете исходное исключение), но это не приведет к фундаментальному повреждению CLR каким-то образом.

+0

Если это не вызвано финализатором, верно? –

0

Таким образом, существует риск того, что StreamWriter может выбросить исключение, а это значит, что мой объект не будет удален? Просто обертывание этого в Try/Catch решит проблему?

Если StreamWriter будет генерировать исключение, единственным побочным эффектом будет то, что следующее не будет выполнено.

log.WriteLine("Disposing"); 
log.Flush(); 

Отдых все будет как ожидается. StreamWriter также будет правильно расположен. (То есть цель ключевого слова using)

+0

Ну, 'StreamWriter' не будет удаляться, если * конструктор * выдает исключение - вызывающему коду нечего было бы распоряжаться. Но, надеюсь, в этом случае он уже очистит все ресурсы, которые он получил до выделения. –

+0

Я знаю, но, как вы уже упоминали, в этом нет ничего. Я должен был быть явным, хотя. – Tilak

Смежные вопросы