2010-07-27 29 views
4

我在C#,.Net 2.0中有一些遺留代碼,其中有人將OpenFileDialog和SaveFileDialaog從工具箱拖到窗體上。這會導致打開和保存對話框在其父對話框創建時被實例化,並且直到父對話框關閉。打開/保存表單實際上只用於一個地方,每個用於在父對話框的生命期間不總是打開/保存的支持文件;這對我來說似乎沒有效率。 我會做的是:爲什麼要在窗體上放置標準對話框?

using (OpenFileDialog openDlg = new OpenFileDialog()) 
    { 
     //initialize openDlg... 

     if (openDlg.ShowDialog() != DialogResult.OK) 
     { 
      //handle OK result 
     } 
    } 

這樣的打開文件對話框將被安置在using語句超出範圍的。除非我錯過了某些資源的快速處理(以及更快的垃圾回收)的價值,否則就不需要在需要時實例化Open/Save File對話框。 即使每次使用其父對話框時都使用了打開/保存對話框,但我並沒有看到任何時候使用它們的重要價值。我的問題是我錯過了什麼?保持開放/保存對話一直有效嗎? 我假設所有其他標準對話框的答案都是相同的:ColorDialog,FolderBrowserDialog和FontDialog。

+1

我同意你的「我會做什麼」部分。由於通用對話需要人機交互,所以我無法想象這個性能是一個大問題。如果你有足夠的通用對話實例,那麼內存就是一個大問題,我會質疑你在做什麼。 – Jack 2010-07-27 20:14:13

回答

4

沒必要。這些對話框只有一個Dispose()方法,因爲它們從Component類繼承。他們不會重寫該方法,因爲他們實際上沒有任何可處置的東西。當對話框關閉時,他們使用的所有系統資源都會被釋放。 Component.Dispose()實現不會進行任何處理,它只是確保將組件從IContainer集合中移除。

這是這些對話框包裝的實現細節。其他組件通常用於Dispose(),ToolTip就是一個很好的例子。爲表單自動生成的Dispose方法確保發生這種情況,請檢查表單的Designer.cs源代碼文件中的「components」字段。這就是爲什麼Component有一個Dispose方法,默認情況下它沒有做任何重要的事情。

避免在表單上放置組件時有一個很大的優點,它允許垃圾收集對話框的.NET包裝類。但是節省的千字節左右是一個微觀優化。

考慮一下這個問題:如果提前處理這些類對象本來就很重要,那麼微軟就不會讓它們成爲組件。

2

我認爲「表單」選項對於初學者來說應該更容易實現,因爲工作主要在編輯器而不是代碼中。

0

好處是你可以設置對話框,但你需要(多選,初始目錄,擴展)等在窗體設計器。

此外,表單設計師可以很容易地將OpenFileDialog拖動到表單上,這樣很多開發人員都可以做到。不能真的責怪他們。

這兩種方法都沒有明顯的優勢或劣勢,我懷疑你會發現任何可感知的性能差異。

0

我通常創建窗體範圍的對話框,當我想持久某些設置,如過濾器,而無需將它們設置爲我使用對話框的每個地方。如果僅在一個地方使用對話框,則我使用using語句,如上所述。

0

我總是想知道這種方法,以及我更喜歡你的代碼段中的使用模式。我所能想到的唯一可能的原因是通過使它們成爲組件,它們的屬性可以在設計器中配置。

不是一個非常令人信服的理由(恕我直言)。

0

我普遍認同。但如果對話框中有大量「默認」屬性數據,則可能會有輕微的性能提升。考慮使用50個文件類型過濾器的文件打開對話框。

1

好的做法是做你所做的事情,因爲你已經聲明這些對話不需要長時間呆在內存中,但是如果它們被多次使用,最好離開它在申請關閉時妥善處理,僅僅取決於情況。

鑑於這種情況,它聽起來像是你的好去處,我也不會對它失去太多的睡眠,但不管它是否在處理方法中做了任何有用的事情,建議使用它的方式,它的良好做法。

相關問題