2012-12-25 58 views
1

我有以下代碼:System.Drawing中對象的非託管資源配置

using System.Drawing; 
... 
Graphics _graphics = Graphics.FromImage(...) 
... 
public void Draw(Stream stream, Rectangle rect, Color color) { 
    _graphics.FillRectangle(new SolidBrush(Color), 0, 0, Width, Height); 
    _graphics.DrawImage(new Bitmap(stream), rect); 
} 

我應該圍繞着使用上的new Bitmap(...)的drawImage? 同樣的問題上new SolidBrush(...)

+0

是的,我想你應該。我也會爲非託管資源做到這一點。它可能允許GC早些時候處理它們。 –

回答

4

是的,你應該包裝在使用語句。你也應該確保在你在這個類中使用的_graphics實例上調用Dispose方法。這可以通過讓包含類實現IDisposable來完成,以便此類的使用者可以將其包裝在using聲明中。

2

是的,處理這些資源很重要。特別是位圖很麻煩,它會消耗大量的非託管內存來存儲像素數據,但託管的Bitmap類包裝非常小。在觸發垃圾回收之前,您可以創建Bitmap對象的批次,由於沒有更多非託管內存,因此很有可能Bitmap構造函數將開始失敗。

所以重寫這樣的:

public void Draw(Stream stream, Rectangle rect, Color color) { 
    using (var bmp = new Bitmap(stream)) 
    using (var brush = new SolidBrush(Color)) { 
     _graphics.FillRectangle(brush, 0, 0, Width, Height); 
     _graphics.DrawImage(bmp, rect); 
    } 
} 
相關問題