2013-08-11 3 views
8

У меня есть этот код, я обеспокоен тем, что он «небезопасен» Я использовал Dispose() перед началом использования, для меня это немного нелогично, но он работает нормально. Так, это безопасно?Что произойдет, если я вызову Dispose() перед использованием конца инструкции?

using (FileStream stream = new FileStream(SfilePath, FileMode.Open)) 
{ 
    try 
    { 
     XmlSerializer deserializer = new XmlSerializer(typeof(HighscoresViewModel)); 
     HVM = deserializer.Deserialize(stream) as HighscoresViewModel; 
    } 
    catch (InvalidOperationException) 
    { 
     stream.Dispose(); 
     (new FileInfo(SfilePath)).Delete(); 
     HVM = new HighscoresViewModel(); 
    } 
} 
+0

Он попытается удалить объект дважды –

+0

@JeroenvanLangen: это неверно. См. Ответ hwd. – siride

+0

@siride - «поток» _will_ будет удален дважды. Единственная ошибка в комментарии Jeroens - это слово «try». –

ответ

14

Документация IDisposable.Dispose состояний:

Если метод Dispose объекта вызывается более чем один раз, то объект должен игнорировать все вызовы после первого. Объект не должен генерировать исключение, если его метод Dispose вызывается несколько раз. Методы экземпляра, отличные от Dispose, могут вызывать исключение ObjectDisposedException, когда ресурсы уже настроены.

Предполагая, что IDisposable выполнено правильно, это использование безопасно. Dispose будет называться второй раз и ничего не сделает во второй раз.

1

Хорошо, как сказал @hvd, что это использование безопасно; но это не рекомендуется причина, если вы реализуете Microsoft Fxcop на образец кода будет сгенерировано FXCop предупреждение/ошибка CA2202: Do not dispose objects multiple times

See here

Который говорит

Реализация метода содержит пути кода, которые могут привести к множественным вызывает IDisposable.Dispose или эквивалент Dispose, например метод Close() для некоторых типов на одном и том же объекте.