2013-08-11 15 views
8

Mam ten kod, obawiam się, że to "nie jest bezpieczne" Użyłem Dispose() przed zakończeniem używania, dla mnie jest to trochę nielogiczne, ale działa dobrze. Czy to jest bezpieczne?Co się stanie, jeśli wywołam Dispose() przed użyciem zakończenia instrukcji?

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

Spróbuje usunąć obiekt dwukrotnie: –

+0

@JeroenvanLangen: To jest nieprawidłowe. Zobacz odpowiedź hwd. – siride

+0

@siride - 'stream' _will_ zostanie usunięty dwa razy. Jedyny błąd w komentarzu Jeroens to słowo "try". –

Odpowiedz

14

Dokumentacja IDisposable.Dispose stanów:

Jeśli metoda Dispose obiektu nazywa się więcej niż raz, obiekt musi zignorować wszystkie połączenia po pierwszym. Obiekt nie może generować wyjątku, jeśli jego metoda Dispose jest wywoływana wiele razy. Instancje metody inne niż Dispose mogą rzucić wyjątek ObjectDisposedException, gdy zasoby są już usunięte.

Założenie, że IDisposable jest zaimplementowane poprawnie, to użycie jest bezpieczne. Dispose zostanie wywołany po raz drugi i nic nie zrobi po raz drugi.

1

Cóż, jak powiedział @ hvd, że to użycie jest bezpieczne; ale nie jest to zalecane przyczyna jeśli wdrożenie Microsoft Fxcop na próbki kodu będzie rzucać ostrzeżenie/błąd FxCop CA2202: Do not dispose objects multiple times

See here

który mówi

Implementacja metody zawiera ścieżki kodu, które mogą spowodować stwardnienie połączenia z IDisposable.Dispose lub równoważnikiem Dispose, takim jak Metoda Close() dla niektórych typów na tym samym obiekcie.

Powiązane problemy