Как правильно использовать оператор "using" для моего кода - PullRequest
1 голос
/ 18 сентября 2011

Это мой код:

Bitmap bmp = ImageManipulator.GetMyImageModified(bmp);
Bitmap tempBMP = ImageManipulator.cropImage(bmp, rect);
tempBMP = ImageManipulator.CopyToBpp(tempBMP, 1);

string bmpFilename = String.Format("File{0}.png", indexNum);
tempBMP.Save(bmpFilename, ImageFormat.Png); 

Теперь я видел, что для объектов IDisposable лучше всего использовать оператор using для удаления этих объектов, как только они больше не нужны.Я хочу следовать этой практике и поэтому мне нужна помощь в переписывании приведенного выше кода:

using (Bitmap bmp = ImageManipulator.GetMyImageModified(bmp){

   Bitmap tempBMP = ImageManipulator.cropImage(bmp, rect); // bmp should be disposed after this line
   tempBMP = ImageManipulator.CopyToBpp(tempBMP, 1);

   string bmpFilename = String.Format("File{0}.png", indexNum);
   tempBMP.Save(bmpFilename, ImageFormat.Png); 
} // bmp is disposed here

Это моя первая попытка, но она не идеальна, поскольку растровое изображение bmp не удаляется в ближайшее времякак больше не нужно, хотя в этом конкретном примере не должно быть обязательным, чтобы он был расположен так быстро.

tempBitmap более проблематично, потому что я не могу переназначить ссылку на новый объект внутри использованияоператор, который должен быть добавлен:

Bitmap tempBMP = ImageManipulator.cropImage(bmp, rect);

Действительно tempBMP ссылка становится readonly после окружения указанной строки строчкой с использованием ключевого слова .

Кроме того, tempBMP сохраняется в файл, и операция сохранения должна быть асинхронной, и тогда я не знаю таких последствий утилизации, как:

tempBMP.Save(bmpFilename, ImageFormat.Png); 

Get call.

Если вы можете помочь мне написать лучший код, я весь слух.

Ответы [ 2 ]

3 голосов
/ 18 сентября 2011
using (var sourceBmp = ...)
using (var modifiedBmp = ImageManipulator.GetMyImageModified(sourceBmp))
using (var croppedBmp = ImageManipulator.cropImage(modifiedBmp, rect))
using (var finalBmp = ImageManipulator.CopyToBpp(croppedBmp, 1))
{
    string bmpFilename = String.Format("File{0}.png", indexNum);
    finalBmp.Save(bmpFilename, ImageFormat.Png); 
}
1 голос
/ 18 сентября 2011

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

        Bitmap bmp = ImageManipulator.GetMyImageModified(bmp);
        var t = new Thread(() => {
            try {
                using (var croppedBmp = ImageManipulator.cropImage(bmp, rect))
                using (var copiedBmp = ImageManipulator.CopyToBpp(tempBMP, 1)) {
                    string bmpFilename = String.Format("File{0}.png", indexNum);
                    copiedBmp.Save(bmpFilename, ImageFormat.Png);
                }
            }
            catch (Exception ex) {
                ReportFailure(ex);
            }
            finally {
                bmp.Dispose();
            }
        });
        t.Start();
...