2009-06-15 62 views
4

舉個例子:如何正確使用實現IDisposable的靜態屬性?

using (Brushes.Black) 
{ 
... 
} 

是不是一個好主意,因爲它是靜態的。下次您的應用使用Brushes.Black時,您將遇到問題,因爲它已被處置。

現在,如果你只使用Brushes.Black,那麼可能沒有處理它,因爲你只留下一個非託管資源(希望!)躺在。

但是,一般來說,你應該避免使用大量的靜態IDisposables,或者是否有我失蹤的東西?

回答

3

通常只是使用它們,讓框架類擔心處置它們。

他們在那裏,以便您可以使用它們,而無需每次創建和處理它們。每一個都是在您第一次使用它時創建的,並且被緩存在一個哈希表中。框架類負責在應用程序關閉時正確處理它們。

真的沒有那麼多的靜態IDisposables,你應該需要擔心它們。如果你會使用很多刷子,你可能會用循環中的顏色來創建它們(然後你會負責處理它們)。

+0

我很驚訝你沒有得到這個任何評論。 通常人們總是對處理IDisposable對象感到非常強烈。 但是,我想在靜態IDisposables的情況下,quideline應該是「不要處理它們,並且不要使用它們中的很多」。 – mbeckish 2009-06-29 17:09:17

+1

您應該處置自己擁有的對象,但由於Brushes類擁有Brush實例,因此無法處理它們。這樣做會使Brushes類包含對不可用對象的引用。 – Guffa 2009-06-29 21:01:27

2

舉個例子:使用

(Brushes.Black){...}

是不是一個好主意,因爲它是 靜態的。下一次你的應用去 使用Brushes.Black,你將有 的問題,因爲它已被 處置。

它不只是一個靜態字段 - 該屬性主動運行代碼以便在需要時創建新實例。試想一下,在相應的代碼(反射):

public static Brush Black 
{ 
    get 
    { 
     Brush brush = (Brush) SafeNativeMethods.Gdip.ThreadData[BlackKey]; 
     if (brush == null) 
     { 
      brush = new SolidBrush(Color.Black); 
      SafeNativeMethods.Gdip.ThreadData[BlackKey] = brush; 
     } 
     return brush; 
    } 
} 
相關問題