unlockbits,lockbits和try-finally

时间:2008-09-25 15:23:10

标签: c# .net

我正在调用一些使用.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/en-us/library/system.drawing.bitmap.unlockbits.aspx)也没有看不适合使用try-finally模式。

尝试 - 最终是必要的还是无偿的?

更新:我最终可能会抓住并重新抛出异常,因为我不知道它可能是什么,而且之前没有抓住它们。

谢谢!

3 个答案:

答案 0 :(得分:7)

try-finally模式是正确的。由于这是外部代码,因此您无法控制抛出的异常,并且无论发生了什么错误,都需要执行UnlockBits清理代码。

答案 1 :(得分:1)

即使您确实捕获了异常,使用finally意味着您不会复制UnlockBits调用,这在我的选项中是一个加号。

答案 2 :(得分:0)

您是否期望抛出某种异常?如果你是,你能抓住它吗?如果没有,那么我没有看到try / finally的重点。

关于例外,也有不同的哲学。就个人而言,我认为它们是“特殊的” - 就像上次文件写入时电源耗尽一样,因此序列化文件比您预期的要短。我不确定当你操纵像这样的位时会发生什么样的异常情况。如果你离开数组的末尾,那也不例外,这只意味着你需要收紧边界检查。