2014-01-22 26 views
1

CA2000釋放對象處置我的MDI子窗體在所有引用超出範圍之前'frm'。 WINPRO FormMain.cs 32代碼分析抱怨「失去範圍之前CA2000處置對象」的時候我不要失去對象範圍</p> <p>在方法<code>FormMain.barButtonItem1_ItemClick(object, ItemClickEventArgs)</code></p> <p>呼叫System.IDisposable.Dispose前

方法:

private void barButtonItem1_ItemClick(object sender, ItemClickEventArgs e) 
{ 
    FormCustomerList frm = new FormCustomerList(); 
    frm.MdiParent = this; 
    frm.Show(); 
} 

這並不是一個嚴重的問題,但是這是爲什麼解僱?

我最終無法使用frm.Dispose()using(),因爲表單不會顯示。

我也試圖處理窗體關閉然後處置,但違反總是在這裏。

+1

在窗體關閉之前不顯示窗體嗎?在這種情況下,你可以在之後調用dispose。否則,您需要在成員中保留一個引用,以便稍後處理。 – Lee

+1

_「我最終不能使用frm.Dispose()或使用(),因爲表單不會顯示」_ - 請顯示您嘗試過的代碼,因爲這應該可行。 – CodeCaster

+1

這是一個虛假的警告。 (在這個非常特殊的情況下)。調用Dispose將摧毀子窗體。我認爲MDI Container知道如何在關閉子窗體時處理它的子窗體。如果您搜索'CA2000誤報',您應該找到成千上萬的鏈接,解釋您爲什麼會收到此消息(這是一個代碼分析警告,而不是編譯器警告) – Steve

回答

2

代碼分析不能說明frm在退出範圍後仍然在做任何事情。在這種特定情況下,對象需要在功能完成後保持活動狀態。

處理此問題的「正確」方法是在父表單中維護對frm的引用。然後可以在父表單的Dispose()方法中處理該引用。

private FormCustomerList frm; 
private void barButtonItem1_ItemClick(object sender, ItemClickEventArgs e) 
{ 
    frm = new FormCustomerList(); 
    frm.MdiParent = this; 
    frm.Show(); 
} 

如果你有一個可以創建多個子窗體(這很可能是,如果你正在使用MDI),你可以保持的子窗體List<>

private List<FormCustomerList> frms = new List<FormCustomerList>(); 
private void barButtonItem1_ItemClick(object sender, ItemClickEventArgs e) 
{ 
    FormCustomerList frm = new FormCustomerList(); 
    frms.Add(frm); 
    frm.MdiParent = this; 
    frm.Show(); 
} 
相關問題