舉個例子:如何正確使用實現IDisposable的靜態屬性?
using (Brushes.Black)
{
...
}
是不是一個好主意,因爲它是靜態的。下次您的應用使用Brushes.Black時,您將遇到問題,因爲它已被處置。
現在,如果你只使用Brushes.Black,那麼可能沒有處理它,因爲你只留下一個非託管資源(希望!)躺在。
但是,一般來說,你應該避免使用大量的靜態IDisposables,或者是否有我失蹤的東西?
舉個例子:如何正確使用實現IDisposable的靜態屬性?
using (Brushes.Black)
{
...
}
是不是一個好主意,因爲它是靜態的。下次您的應用使用Brushes.Black時,您將遇到問題,因爲它已被處置。
現在,如果你只使用Brushes.Black,那麼可能沒有處理它,因爲你只留下一個非託管資源(希望!)躺在。
但是,一般來說,你應該避免使用大量的靜態IDisposables,或者是否有我失蹤的東西?
通常只是使用它們,讓框架類擔心處置它們。
他們在那裏,以便您可以使用它們,而無需每次創建和處理它們。每一個都是在您第一次使用它時創建的,並且被緩存在一個哈希表中。框架類負責在應用程序關閉時正確處理它們。
真的沒有那麼多的靜態IDisposables,你應該需要擔心它們。如果你會使用很多刷子,你可能會用循環中的顏色來創建它們(然後你會負責處理它們)。
舉個例子:使用
(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;
}
}
我很驚訝你沒有得到這個任何評論。 通常人們總是對處理IDisposable對象感到非常強烈。 但是,我想在靜態IDisposables的情況下,quideline應該是「不要處理它們,並且不要使用它們中的很多」。 – mbeckish 2009-06-29 17:09:17
您應該處置自己擁有的對象,但由於Brushes類擁有Brush實例,因此無法處理它們。這樣做會使Brushes類包含對不可用對象的引用。 – Guffa 2009-06-29 21:01:27