2008-09-25 7 views
5

.NET에서 BitmapData 클래스를 사용하는 일부 코드를 호출하고 있습니다. Googlespace에서 확실한 답을 찾을 수없는 무언가를 발견했습니다. unlockbits, lockbits 및 try-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 패턴을 사용하기에는 적합하지 않다는 것입니다.

try-finally 필요 또는 무료입니까?

업데이트 : 나는 그것이 무엇인지 모르고 이전에 잡아 내지 못했기 때문에 예외를 포착하고 재실행 할 수 있습니다.

감사!

답변

7

try-finally 패턴이 정확합니다. 이것은 외부 코드이므로 던져 질 예외를 제어 할 수 없으며 어떤 오류가 발생했는지에 관계없이 UnlockBits 정리 코드를 실행해야합니다.

0

어떤 종류의 예외가 발생할 것으로 예상됩니까? 너라면 그걸 잡을 수 있니? 그렇지 않다면 나는 try/finally의 요점을 보지 못한다.

예외에 대한 철학도 있습니다. 개인적으로, 저는 그것들을 '예외적'인 것으로 생각합니다 - 당신의 마지막 파일 쓰기가 일어 났을 때 힘이 나가서 당신의 직렬화 된 파일이 예상보다 짧습니다. 이런 종류의 비트를 조작 할 때 어떤 예외적 인 상황이 발생할 수 있는지 잘 모르겠습니다. 배열의 끝에서 벗어나면 예외는 아닙니다. 경계 확인을 강화해야한다는 것입니다.

+0

좋은 지적입니다. 코드가 우리 코드가 아닙니다. 그것은 우리가 함께 작업하는 독점 라이브러리에 속합니다. – Chris

1

예외를 catch하더라도 finally를 사용하면 UnlockBits 호출을 복제하지 않는다는 것을 의미합니다. 이는 내 옵션에서 더하기입니다.

관련 문제