如何正确使用“using”语句用于我的代码

时间:2011-09-18 16:08:33

标签: c# object idisposable using

这是我的代码:

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 位图不再需要时不再处理,但在这个具体示例中不应强制要求它如此快速地处理。< / p>

tempBitmap 更有问题,因为我无法重新分配应该使用的using语句中的新Object的引用:

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

确实 tempBMP 引用在使用使用关键字包围上述行后变为 readonly

此外,tempBMP被保存到文件中,并且保存操作应该是异步的,然后我不知道像以下那样处置的影响:

tempBMP.Save(bmpFilename, ImageFormat.Png); 

来电。

如果你可以帮助我写出更好的代码,我会全力以赴。

2 个答案:

答案 0 :(得分:3)

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 :(得分:1)

使用关键字只是一种便利。显式调用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();