解锁位,锁定位和最终尝试
时间:2020-03-06 14:43:36 来源:igfitidea点击:
我正在调用一些使用.NET中的BitmapData类的代码。我遇到了一些我无法在Googlespace上找到确切答案的问题。
因为似乎必须始终成对调用LockBits和UnlockBits,所以我正在使用以下代码:
System.Drawing.Imaging.BitmapData tempImageData = tempImage.LockBits( new System.Drawing.Rectangle(0, 0, tempImage.Width, tempImage.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, tempImage.PixelFormat); try { //use external library on the data }//Exception not handled here; throw to calling method finally { tempImage.UnlockBits(tempImageData); }
(最近我一直在使用using语句,该语句在C#中非常有用,这使我想到应该执行此操作。)问题甚至是MS自己的文档(http://msdn.microsoft.com/ zh-cn / library / system.drawing.bitmap.unlockbits.aspx)认为不适合使用try-finally模式。
最后尝试还是免费的?
更新:我可能最终捕获并重新抛出了异常,因为我不知道它可能是什么,并且没有更早地捕获它们。
谢谢!
解决方案
我们是否希望引发某种异常?如果是,我们能抓住它吗?如果没有,那么我看不到尝试/最终的意义。
关于例外,也有不同的观念。就我个人而言,我认为它们是"例外"的,就像上次写入文件时发生了故障一样,因此序列化的文件比预期的要短。我不确定当我们像这样操作位时会发生什么样的异常情况。如果我们走出数组的末尾,那不是例外,这仅意味着我们需要加强边界检查。
即使我们确实捕获到异常,使用finally也意味着我们不会重复UnlockBits调用,这对我来说是一个加号。
try-finally模式是正确的。由于这是外部代码,因此我们无法控制抛出什么异常,并且无论发生了什么错误,都需要执行UnlockBits清理代码。