2013-06-04 6 views
5

Mam następującą funkcję:połączeń System.IDisposable.Dispose na obiekcie „emailForm” przed wszystkimi odniesieniami do niego są poza zakresem

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

co daje mi następujące ostrzeżenie:

Ostrzeżenie 1 CA2000: Microsoft.Reliability: W metodzie "VideoPlayerControl.emailVideoButton_Click (object, EventArgs)", zadzwoń pod System.IDisposable.Dispose na obiekt "emailForm" zanim wszystkie odniesienia do niego będą poza zakresem.

Czytałem ten link http://msdn.microsoft.com/en-us/library/ms182289(v=vs.80).aspx i zebrane, że muszę zadzwonić .Dispose tak:

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

Ale wtedy pojawia się następujące ostrzeżenie:

OSTRZEŻENIE 1 CA2000: Microsoft. Niezawodność: W metodzie "VideoPlayerControl.emailVideoButton_Click (object, EventArgs)" obiekt "emailForm" nie jest ułożony wzdłuż wszystkich ścieżek wyjątków. Zadzwoń pod System.IDisposable.Dispose na obiekcie "emailForm" zanim wszystkie odwołania są poza zakresem.

Czy ktoś może mi pomóc pozbyć się tego ostrzeżenia?

Odpowiedz

12

Co kompilator próbuje powiedzieć, że jeśli zostanie zgłoszony wyjątek w emailForm.ShowDialog(), Dispose() nie zostanie wywołany.

Użyj oświadczenia using, aby upewnić się, że zostanie wywołany w dowolny sposób.

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

Jest to równoznaczne z tym kodem:

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

Więc nie trzeba ręcznie wywołać .Dispose wtedy, gdy używam tej metody ???? –

+1

Zgadza się. Kompilator doda do ciebie wywołanie "Dispose". – Rotem

+1

czy drugi kod w twoim przykładzie naprawdę działa? kiedy to zrobię, otrzymam nazwę, która nie istnieje w bieżącym błędzie kontekstu. – Bastardo

4

Potrzebujesz instrukcji using, która będzie wywoływać Dispose() w bloku finally, aby upewnić się, że zostanie usunięta, nawet jeśli zostanie zgłoszony wyjątek.