2011-08-31 22 views
2

我有一個基本的形式,將嘗試加載和播放用戶的視頻。該表單可以從公共靜態ShowDialogForm方法調用。如果成功,該方法將嘗試初始化視頻,然後表單返回,否則操作被取消。在我的辦公室,我們使用重構工具,它抱怨我的方法中缺少使用聲明。所以我的問題是好的,如果在這種情況下使用聲明提供。使用狀態和表格

這是原來的代碼

public static DialogResult ShowDialogForm(VideoNames videoName, Course course, IWin32Window parent) 
{ 
    FlashPlayer form = new FlashPlayer(); 

    if (form.Initialize(videoName, course)) 
    { 
    return form.ShowDialog(parent); 
    } 
    else 
    { 
    return DialogResult.Cancel; 
    } 
} 

這是重構工具

public static DialogResult ShowDialogForm(VideoNames videoName, Course course, IWin32Window parent) 
{ 
    using (FlashPlayer form = new FlashPlayer()) 
    { 
    if (form.Initialize(videoName, course)) 
    { 
     return form.ShowDialog(parent); 
    } 
    else 
    { 
     return DialogResult.Cancel; 
    } 
    } 
} 
+1

如果flash播放從System.Windows.Forms的繼承,那麼它實現'IDisposible'和使用'using'自動調用'的Dispose()'當您使用的形式完成。的 –

+0

可能重複[什麼是C#中使用塊和我爲什麼要使用它?(http://stackoverflow.com/questions/212198/what-is-the-c-using-block-and-why-should-我使用的,它) –

+0

這樣的想法是,我並不需要把Dispose()方法調用導致窗體關閉事件,如單擊X按鈕,或做鏈接? – Siegeon

回答

1

那麼,該工具的投訴是有效的。當使用ShowDialog()顯示錶單時,表單對象不會像使用Show()時那樣自動處理。這很重要,您通常使用對話框讓用戶輸入您在ShowDialog返回後再檢索的值。放置表單控件會導致風險,可能會觸發ObjectDisposedException。

因此,您始終使用語句將對話框創建,顯示和結果檢索包裝爲,以便在完成所有操作後處理表單。

但請注意,您實際上並未使用此對話框來檢索任何內容。這可能意味着它不應該是一個對話。所以使用Show()並且你不必處理它。假設合適,用戶可以自由地繼續使用其餘的用戶界面。非模態用戶界面始終是首選。

+0

這個想法是爲了防止用戶在播放視頻時與界面的其餘部分進行交互。有沒有更適當的方法來做到這一點? – Siegeon

+0

那麼,一個對話肯定會做到這一點。這不是唯一的方法,您可以將Play按鈕的Enable屬性設置爲false,以便用戶無法再次啓動視頻。使用FormClosed事件將其重新設置爲true。它是由你決定。 –

1

建議的代碼using語句將包裝在一個try-finally你的「的IDisposable」的FlashPlayer使用塊,這意味着FlashPlayer將在完成後處理。在釋放資源時這被認爲是最佳做法。

通常情況下,如果某件東西實現了IDisposable,最好將它包裝在using語句中,或者通過調用flashPlayer.Dispose()手動清理。

2

是的,你應該封裝任何在using區塊中實現IDisposable的對象,以確保它可以被GC正確處置。在一個winforms或wpf應用程序中,您應該特別瞭解這一點,其中內存和進程需要更嚴格的控制。

1

好處可能並不重要,但在類上實現了IDisposable的情況下,using語句確保代碼將安全執行。如果這個類實現它,最有可能的原因是它。

1

您的工具是正確的。既然形式是一次性的,一旦你完成了它。你必須處置。使用語句會自動爲您執行此操作。