解锁位,锁定位和最终尝试

时间: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清理代码。