2009-09-10 87 views
1

是否需要手動管理System.Drawing對象的生命週期?處理System.Drawing對象

目前,我正在使用'using'語句來最大限度地減少畫筆和其他繪圖對象的使用壽命,例如

using (Brush br = new SolidBrush(color)) 
{ 
    // Do something with br 
} 

這是必要的還是安全的讓垃圾收集器工作時,如果它的魔法需要?

作爲一個快速拋開這個問題......人們認爲什麼是最簡單的方法來實現這一目標?

回答

2

它是處置System.Drawing對象,但是如果您錯過了一個或者當你得到一個異常等兩個,這不是世界末日。 (其他對象像打開的文件和數據庫連接必須始終處理

在您的代碼中使用大量「使用」語句會使其更加複雜。因此,我想在System.Drawing對象的情況下,考慮只是在方法的末尾調用Dispose()。

在過去,我使用了一個我編寫的「Dustcart」類,它實現了IDisposable,並且包含了要處理的對象集合。然後,您可以編寫如下代碼:

using(var dustcart = new Dustcard()) 
{ 
    var p = dustcart.Add(new Pen(red, etc)); 
    var b = dustcart.Add(new Brush(black)); 

    Pen t; 
    if (someFlag) 
    { 
     t = p; 
    } 
    else 
    { 
     t = dustcard.Add(new Pen(etc)); 
    } 
} 
+0

我喜歡這個想法,即通過處置垃圾車,你可以處理其中的所有物品!我認爲這是我要去嘗試和記住下一次我需要考慮管理對象的使用壽命的一些事情。不過,我想這隻會在您看到大量需要處理的嵌套使用語句或多個對象時纔有意義。 – 2009-09-28 07:17:39

+0

@Tk,當您有條件地創建新對象或重新使用現有對象時,它非常有用。當簡單的「嵌套使用語句」是不夠的。在簡單的情況下,「使用」是最好的,因爲每個人都知道它的含義 – 2009-10-08 21:59:02

2

一般的經驗法則是,如果一個對象實現了IDisposable,你需要清理它。 IDisposable沒有在.NET Framework中隨心所欲實現 - 有充足的理由讓它在那裏。

10

當一個對象是IDisposable時,那麼最好在你不再需要時立即處理它。 (由於某種原因它實現了IDisposable)。

當您忘記調用Dispose時,垃圾收集器將在某個時間完成它的工作並清理它,這樣資源就會被釋放,但您無法分辨或猜測垃圾收集器何時會啓動,這不是確定性的。

所以,我的建議是:一旦你不再需要一次性物品,手動處理(就像你現在所做的那樣)。

1

正如其他人所說:當你創建一個IDisposable對象時,你應該儘快處理它。在您的具體示例中,如果在編譯時已知顏色,則可以使用標準筆刷,例如Br​​ush br = Brushes.Blue,您不需要處理該筆刷。

+1

我喜歡使用預定義對象(如Brushes.Blue)的觀點。這也更有效率,因爲你不必實例化一個新對象並浪費內存。 – dotnetengineer 2015-04-21 21:00:45

1

如果反覆使用相同的顏色,可以將筆刷存儲爲類級別的成員,但這意味着擁有的類別也應該是IDisposable,並將刷子成員置於其處理方法中。 這會增加內存的存儲空間(按一個筆刷的大小),但可能會減少代碼量(不使用語句,而是額外的Dispose覆蓋)。

+0

我很喜歡這個想法,不幸的是,我已經決定將所有這些繪圖功能抽象爲支持類型的類。因此,支持職能沒有「所有者」,這意味着最終處置仍然是一個問題。再加上這些函數可以從多個線程訪問的事實意味着添加類級別的變量可能最終會變得更加麻煩,那麼它的價值! – 2009-09-10 10:10:52

0

我正在使用'using'語句,正如您在問題中所描述的一樣,以保證Brush,Pen,Font,任何資源都能正確處理。在我的代碼中,我發現使用語句比分散顯式的.Dispose()調用更清潔。但這只是我的偏好。

我同意上面的答案:不管你喜歡使用語句還是使用.Dispose調用,手動清理資源非常重要,而不是依靠垃圾回收器。 (我剛開始依賴垃圾回收器,性能問題開始浮現,甚至在應用中的事情變得複雜之前)。