2010-03-02 49 views
9

許多GDI +類實現了IDisposable,但我不確定何時應該調用Dispose。對於我使用new創建的實例或者使用像Graphics.CreateGraphics這樣的靜態方法,很明顯。但是屬性獲得者返回的對象又如何?我經常寫這樣的代碼:你什麼時候處理GDI +資源?

var oldRgn = g.Clip; 
using (var rectRegion = new Region(rectangle)) 
{ 
    g.Clip = rectRegion; 
    // draw something 
} 
g.Clip = oldRgn; 

我應該處理後oldRgn?如果我不記得,我的記憶分析器告訴我有沒有未處理的實例。而看着反射器實施至少證實,吸氣明顯地創造一個新的實例每次它的調用時間:

// Graphics.Clip code from Reflector: 
public Region get_Clip() 
{ 
    Region wrapper = new Region(); 
    int status = SafeNativeMethods.Gdip.GdipGetClip(new HandleRef(this, this.NativeGraphics), new HandleRef(wrapper, wrapper.nativeRegion)); 
    if (status != 0) 
    { 
     throw SafeNativeMethods.Gdip.StatusException(status); 
    } 
    return wrapper; 
} 

我無法找到有關在MSDN什麼,文檔中的樣本似乎永遠處置任何東西。

+0

嘗試將「g.Clip = oldRgn」移動到使用塊中。 – 2010-03-02 09:31:47

回答

2

一般而言,如果該類別爲IDisposable,則在不需要該對象時必須調用.Dispose方法。

此外,MSDN庫說:

修改區域對象返回 通過剪輯屬性不影響 後續繪製與圖形 對象。要更改剪輯區域,請使用 新區域對象替換剪輯屬性值, 。

這意味着,你必須處置oldRgn

+0

我已經閱讀了MSDN第四段,但我仍然沒有看到連接。 'Brushes.Red'也可以這樣說;吸氣劑返回一次性物體;修改對象不會影響後續繪圖。但這是否意味着我每次調用getter都必須處理'Brushes.Red'? – Niki 2010-03-02 10:55:42

+2

由於'Brushes.Red'是一個靜態屬性,因此您可能不需要處理該對象。否則,爲什麼該屬性是靜態的?這樣做是爲了保存一個經常訪問的對象,以便進行全局訪問和資源重用。這是你和你最初的問題之間的區別。但是,如果有任何不確定性,使用反射器總是有意義的。 – Kerido 2010-03-02 11:43:45

+0

所以基本上,沒有規則 - 你總是要看源代碼,以確定是否必須處理屬性獲取器的結果。在不明確的情況下賭注GC。我擔心如此,但無論如何感謝您的回答。 – Niki 2010-03-05 12:23:11