2008-09-25 29 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調用,這是我的選擇中的一個優點。