2013-08-11 2 views
8

Ich habe diesen Code, ich bin besorgt, dass es "nicht sicher ist" Ich habe Dispose() vor der Verwendung der Anweisung Ende, für mich ist es ein wenig unlogisch, aber es funktioniert gut. Also, ist es sicher?Was passiert, wenn ich Dispose() vor der Verwendung des Anweisungsendes aufgerufen habe?

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

Es wird versuchen, das Objekt zweimal zu entsorgen –

+0

@JeroenvanLangen: das ist falsch. Siehe hwds Antwort. – siride

+0

@siride - der 'Stream' _will_ wird zweimal entsorgt. Der einzige Fehler in Jeroen's Kommentar ist das Wort "try". –

Antwort

14

Die Dokumentation für IDisposable.Dispose Zustände:

Wenn ein Dispose-Methode des Objekts mehr als einmal aufgerufen wird, muss das Objekt alle Anrufe nach dem ersten ignorieren. Das Objekt darf keine Ausnahme auslösen, wenn seine Dispose-Methode mehrmals aufgerufen wird. Instanzmethoden außer Dispose können eine ObjectDisposedException auslösen, wenn Ressourcen bereits entsorgt werden.

Angenommen, IDisposable ist korrekt implementiert, ist diese Verwendung sicher. Dispose wird ein zweites Mal aufgerufen, und wird das zweite Mal nicht tun.

1

Gut wie gesagt @hvd, dass diese Verwendung sicher ist; aber es ist nicht Ursache zu empfehlen, wenn Sie Microsoft implementieren Fxcop auf Ihrem Codebeispiel wird eine FXCop Warnung/Fehler CA2202: Do not dispose objects multiple times

See here

werfen Was sagt

Verfahren Implementierung Codepfade enthält, die mehrere dazu führen könnten, Aufrufe an IDisposable.Dispose oder ein Entsprechendes Äquivalent, z. B. eine Close() - Methode für einige Typen für dasselbe Objekt.

Verwandte Themen