2013-06-04 56 views
5

我有以下功能:呼叫System.IDisposable.Dispose超出範圍

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

這給了我以下警告:

警告1 CA2000:Microsoft.Reliability:在方法 'VideoPlayerControl.emailVideoButton_Click(object,EventArgs)'中,調用 System.IDisposable.Dispose在對象'emailForm'之前所有引用 超出範圍。

我看這個鏈接http://msdn.microsoft.com/en-us/library/ms182289(v=vs.80).aspx和聚集,我需要調用.Dispose像這樣:

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

但後來我得到以下警告:

警告1個CA2000:微軟。可靠性:在方法 'VideoPlayerControl.emailVideoButton_Click(object,EventArgs)'中,對象 'emailForm'不會沿着所有異常路徑放置。調用 System.IDisposable.Dispose在對象'emailForm'之前,所有引用 超出範圍。

誰能幫我擺脫這個警告嗎?

回答

12

編譯器試圖說的是,如果在emailForm.ShowDialog()中引發異常,則不會調用Dispose()

使用using語句來確保它會被調用。

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

這相當於這個代碼:

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

所以我不必手動調用.Dispose然後當我用這個方法???? –

+1

這是正確的。編譯器會爲你添加Dispose調用。 – Rotem

+1

你的例子中的第二個代碼真的有用嗎?當我這樣做,我得到一個名稱不存在當前上下文錯誤。 – Bastardo

4

您需要using聲明,該聲明將在finally塊中調用Dispose(),以確保即使引發異常也會丟棄它。