2013-06-04 2 views
5

Ich habe die folgende Funktion:Anruf System.IDisposable.Dispose auf Objekt ‚emailForm‘ vor allen Verweise darauf sind außerhalb des Gültigkeitsbereichs

private void emailVideoButton_Click(object sender, EventArgs e) 
    { 
     VideoEMailForm emailForm = new VideoEMailForm(); 
     emailForm.ShowDialog(); 
    } 

die mir die folgende Warnung gibt:

Warning 1 CA2000: Microsoft.Reliability: In Methode 'VideoPlayerControl.emailVideoButton_Click (Objekt, EventArgs)', rufen Sie System.IDisposable.Dispose auf Objekt 'E-MailForm', bevor alle Referenzen zu ihr außerhalb des Geltungsbereichs sind.

Ich las diesen Link http://msdn.microsoft.com/en-us/library/ms182289(v=vs.80).aspx und gesammelt, dass ich .Dispose wie so nennen benötigt:

private void emailVideoButton_Click(object sender, EventArgs e) 
    { 
     VideoEMailForm emailForm = new VideoEMailForm(); 
     emailForm.ShowDialog(); 
     emailForm.Dispose(); 
    } 

Aber dann bekomme ich die folgende Warnung:

Warnung 1 CA2000: Microsoft. Zuverlässigkeit: In Methode 'VideoPlayerControl.emailVideoButton_Click (Objekt, EventArgs)', Objekt 'E-MailForm' ist nicht entlang aller Ausnahme Pfade angeordnet. Rufen Sie System.IDisposable.Dispose für das Objekt 'E-MailForm' auf, bevor alle Referenzen darauf liegen.

Kann jemand mir helfen, diese Warnung loszuwerden?

Antwort

12

Was der Compiler zu sagen versucht, ist, dass, wenn eine Ausnahme in emailForm.ShowDialog() ausgelöst wird, Dispose() nicht aufgerufen wird.

Verwenden Sie eine using-Anweisung, um sicherzustellen, dass sie in beide Richtungen aufgerufen wird.

private void emailVideoButton_Click(object sender, EventArgs e) 
{ 
    using (VideoEMailForm emailForm = new VideoEMailForm()) 
    { 
     emailForm.ShowDialog(); 
    } 
} 

Dies entspricht diesen Code:

private void emailVideoButton_Click(object sender, EventArgs e) 
{ 
    VideoEMailForm emailForm = null; 
    try 
    { 
     emailForm = new VideoEMailForm(); 
     emailForm.ShowDialog(); 
    } 
    finally 
    { 
     if (emailForm != null) 
     { 
      ((IDisposable)emailForm).Dispose(); 
     } 
    } 
} 
+0

So habe ich nicht manuell .Dispose rufe dann, wenn ich diese Methode verwenden ???? –

+1

Das ist richtig. Der Compiler fügt den 'Dispose'-Aufruf für Sie hinzu. – Rotem

+1

funktioniert der zweite Code in Ihrem Beispiel wirklich? Wenn ich dies tue, bekomme ich einen Namen, der im aktuellen Kontextfehler nicht existiert. – Bastardo

4

Sie benötigen die using Anweisung, die Dispose() in einem finally Block aufrufen wird, um sicherzustellen, dass es entsorgt wird, selbst wenn eine Ausnahme ausgelöst wird.

Verwandte Themen