2012-01-25 28 views
0

我正在看一個用C#編寫的小圖像裁剪和調整大小庫。它由一個具有靜態方法的單個靜態類組成,用於調整大小和裁剪功能。我是否需要處理靜態類的靜態方法中使用的位圖實例?

例如裁剪方法:

public static Image Crop(Image img, Rectangle cropArea) 
{ 
    var bmpImage = new Bitmap(img); 
    var bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat); 
    return bmpCrop; 
} 

我知道,通常情況下,位圖對象需要進行處置,以防止內存泄漏,但是這是因爲類是靜態的不同呢?

我不想要實現這個庫,並運行到內存問題的道路

回答

3

首先,當使用位圖時,如果您在任何時候希望使用多個線程,我都會警告不要使用靜態類。一次不能有多個線程使用位圖。

using(Graphics g = Graphics.FromImage(bmpCrop) 
{ 
    // do something 
} 

,並在另一個

int w = bmpCrop.Width 

你會得到一個無效的參數異常:因此,例如,如果你下次在一個線程中這樣做。

接下來,在你的榜樣,我看到三個鏡像實例...

  • IMG
  • bmpImage
  • bmpCrop

現在你是不是在這個功能配置bmpImage並需要。 在此通話之後,呼叫者有責任在某個時刻處理img和bmpCrop

1

靜態的不改變處置的要求(作爲一般規則)。你必須考慮的是,在之後,將使用Bitmap靜態方法已完成。因此,例如,如果您將Bitmap退回到您的函數之外,那麼您不希望處理它,因爲您期望其他人(某些其他代碼)需要使用它,所以它成爲他處置它的責任。

但是,方法本身是靜態的這一事實沒有任何影響,如果您將其置於非靜態方法中,則應該使用靜態方法處理它。

相關問題