【发布时间】:2011-09-18 16:08:32
【问题描述】:
这是我的代码:
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 更成问题,因为我无法将引用重新分配给 using 语句中应该包含的新对象:
Bitmap tempBMP = ImageManipulator.cropImage(bmp, rect);
确实 tempBMP 引用在用 using 关键字包围上述行后变为 readonly。
tempBMP 也被保存到一个文件中,并且保存操作应该是异步的,然后我不知道处置的影响:
tempBMP.Save(bmpFilename, ImageFormat.Png);
被调用。
如果你能帮我写出更好的代码,我会全力以赴。
【问题讨论】:
-
Save()不是异步的。 -
tempBMP中有两个不同的位图,您应该将它们都处理掉。所以无论如何你都需要把它分成两个变量。 -
@Slaks 感谢您解决问题。
-
一般来说,至少对于像位图这样的可替代资源,人们不应该担心在第一时间调用 IDisposable 上的 Dispose。重要的是 Dispose 在可预见的时间范围内被调用。通常,使用块嵌套并让较晚创建的对象在较早创建的对象之前被释放,比以更任意的顺序创建和销毁对象要好。
标签: c# object idisposable using