2008-09-25 20 views
5

我打电话给一些使用.NET的BitmapData类的代码。我碰到了一些我无法在Google桌面上找到明确答案的地方。unlockbits,lockbits,并试试finally

因为它似乎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模式。

试试最后是必要的还是无偿的?

更新:我可能最终会捕捉并重新抛出异常,因为我不知道它可能是什么,也没有早期捕捉它们。

谢谢!

回答

7

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

0

您是否期待某种异常被抛出?如果你是,你能抓住它吗?如果没有,那么我没有看到最后的尝试/重点。

也有不同的例外哲学。就我个人而言,我认为它们是“特殊的” - 就像上次文件写入时电源熄灭一样,所以您的序列化文件比您期望的要短。我不确定当你操纵这样的位时会出现什么样的特殊情况。如果你走出数组的末尾,这并不例外,这意味着你需要加强你的边界检查。

+0

一个很好的观点,在这里。 该代码不是我们的;它属于我们合作的专有库。 – Chris 2008-09-25 15:33:41

1

即使您确实发现了异常,使用finally也意味着您不会复制UnlockBits调用,这是我的选择中的一个优点。