Нужно ли удалять экземпляры Bitmap, используемые в статическом методе статического класса? - PullRequest
0 голосов
/ 26 января 2012

Я смотрю на небольшую библиотеку обрезки и изменения размера изображения, написанную на C #.Он состоит из одного статического класса со статическими методами для функций изменения размера и обрезки.

Например, метод обрезки:

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

Я знаю, что обычно объекты Bitmap нужно удалять впредотвратить утечки памяти, но разве это другой случай из-за того, что класс статичен?

Я не хочу реализовывать эту библиотеку и столкнуться с проблемами с памятью в будущем

Ответы [ 2 ]

3 голосов
/ 26 января 2012

Во-первых, при использовании растровых изображений я бы предостерегал от использования их из статического класса, если в любое время вы хотите использовать более одного потока.Ни одно растровое изображение не может использоваться более чем одним потоком одновременно.Например, если вы в следующий раз сделали это в одном потоке:

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

, а в другом

int w = bmpCrop.Width

вы получите недопустимое исключение параметра.

Далее, вв вашем примере я вижу три экземпляра изображения ...

  • img
  • bmpImage
  • bmpCrop

Сейчас вы неРасполагая bmpImage в этой функции и нужно будет.После этого вызова вызывающие в какой-то момент будут обязаны избавиться от img и bmpCrop

1 голос
/ 26 января 2012

Статичность не меняет требования к утилизации (как правило).Что вы должны учитывать, так это Bitmap будет использоваться после статический метод завершен.Так, например, если вы возвращаете Bitmap из своей функции, тогда вы не хотите избавляться от нее, потому что ожидаете, что кому-то еще (некоторому другому коду) понадобится его использовать, итак что он несет ответственность за его уничтожение.

Но сам факт того, что сам метод является статическим, не имеет никакого значения, если бы вы избавились от него нестатическим методом, вы должны избавиться от него встатический метод.

...