2008-09-25 11 views
5

Wywołuję kod korzystający z klasy BitmapData z .NET. Uderzyłem w coś, w którym nie mogę znaleźć ostatecznej odpowiedzi w Googlespace.klucze odblokowujące, lockbity i próbne w końcu

Ponieważ wydaje się, że LockBits i UnlockBits musi być zawsze nazywa się parą, używam to:

  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); 
     } 

(I niedawno zostały gry z wykorzystaniem rachunku, co jest bardzo przydatne w C#, co dało mi pomysł, że powinienem to zrobić.) Kłopot w tym, że nawet własna dokumentacja MS (http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.unlockbits.aspx) nie uważa, że ​​jest w stanie użyć wzorca try-finally.

Czy w końcu jest to konieczne lub nieodpłatne?

Aktualizacja: Mogę skończyć łowiąc i odrzucając wyjątek, ponieważ nie wiem, co to może być i nie złapał ich wcześniej.

Dzięki!

Odpowiedz

7

Wzór try-finally jest poprawny. Ponieważ jest to kod zewnętrzny, nie masz kontroli nad tym, jakie wyjątki są zgłaszane, a kod usuwania UnlockBits musi zostać wykonany niezależnie od tego, jaki błąd wystąpił.

0

Czy spodziewasz się, że jakiś wyjątek zostanie odrzucony? Jeśli tak, możesz go złapać? Jeśli nie, to nie widzę sensu/próby.

Istnieją również różne filozofie dotyczące wyjątków. Osobiście uważam je za "wyjątkowe" - tak jak moc wyszła, kiedy zapisano ostatni plik, więc twój serializowany plik jest krótszy, niż się spodziewasz. Nie jestem pewien, jaka wyjątkowa sytuacja może się zdarzyć, kiedy manipulujesz takimi bitami. Jeśli wyjdziesz z końca szyku, nie jest to wyjątkowe, oznacza to tylko, że musisz zaostrzyć sprawdzanie granic.

+0

Dobra uwaga, tutaj. Kod nie jest nasz; należy do zastrzeżonej biblioteki, z którą współpracujemy. – Chris

1

Nawet jeśli zauważysz wyjątek, użycie w końcu oznacza, że ​​nie duplikujesz połączenia UnlockBits, co jest plusem w mojej opcji.