1 / 16

IDisposable を成敗する

IDisposable を成敗する. guicheng. IDisposable オブジェクトは、使用したら確実に Dispose() しなければならない。 Dispose() し忘れるとメモリリークやゾンビプロセスが発生する。 例外の考慮も 必要。 特に、 COM ベース のライブラリを使用する場合は注意が必要。 Excel LDAP などなど. んじゃ、どう やって IDisposable オブジェクトを成敗するか。. 1. 普通に Dispose(). Dispose01 disp_obj = new Dispose01 ();

Télécharger la présentation

IDisposable を成敗する

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. IDisposable を成敗する guicheng

  2. IDisposable オブジェクトは、使用したら確実にDispose() しなければならない。 • Dispose() し忘れるとメモリリークやゾンビプロセスが発生する。 • 例外の考慮も必要。 • 特に、COMベースのライブラリを使用する場合は注意が必要。 • Excel • LDAP • などなど

  3. んじゃ、どうやってIDisposable オブジェクトを成敗するか。

  4. 1. 普通に Dispose() Dispose01 disp_obj = newDispose01(); Console.WriteLine( "何か処理" ); disp_obj.Dispose();

  5. 1. 普通に Dispose() • 利点 • 簡潔明瞭。誰でもわかる。 • 欠点 • 例外が発生するとDispose()されない。 • Dispose()を書き忘れる場合がある。 • 変数が増えるととんでもないことになる。

  6. 2. try-catch 構文を使う Dispose01 disp_obj = null; try{ disp_obj = newDispose01(); Console.WriteLine( "何か処理" ); }catch{ Console.WriteLine( "例外処理" ); }finally{ if( disp_obj != null ){ disp_obj.Dispose(); } }

  7. 2. try-catch 構文を使う • 利点 • 例外が発生しても確実にDispose()を駆動できる。 • 欠点 • ネストすると大変なことになる • Excel を扱おうと思うとえらいことに……

  8. 2. try-catch 構文を使う Dispose01 disp_obj01 = null; try{ disp_obj01 = newDispose01(); Dispose02 disp_obj02 = null; try{ disp_obj02 = disp_obj01.GetChiled(); }finally{ if( disp_obj02 != null ){ disp_obj02.Dispose(); } } }finally{ if( disp_obj01 != null ){ disp_obj01.Dispose(); } }

  9. 3. using 構文を使う try{ using( Dispose01 disp_obj = newDispose01() ) { Console.WriteLine( "何か処理"); } }catch{ Console.WriteLine( "例外処理" ); }

  10. 3. using 構文を使う • 利点 • 確実にDispose()できる • タイプ量が少ない • 欠点 • using()内で例外が発生すると dispose() が駆動しない • ネストが深くなる問題は変わらない

  11. 3. using 構文を使う try{ using( Dispose01 disp_obj01 = newDispose01() ){ using( Dispose02 disp_obj02 = disp_obj01.GetChiled() ){ using( Dispose03 disp_obj02 = disp_obj02.GetChiled() ){ Console.WriteLine( "何か処理" ); } } } }catch{ Console.WriteLine( "例外処理" ); }

  12. 4. Stack を使う Stack<IDisposable> disp_stack = newStack<IDisposable>(); try{ Dispose01 disp_obj = newDispose01(); disp_stack.Push( disp_obj ); Console.WriteLine( "何か処理" ); }finally{ foreach( IDisposable stack_elem in disp_stack ){ stack_elem.Dispose(); } }

  13. 4. Stack を使う • 利点 • 例外が発生しても確実にDispose()できる。 • 先入れ後出しで処理できる。 • ネストが深くならない。 • 欠点 • 生成したオブジェクトをスタックに Push() しなければならない。 • あとでDispose()することと比較したら利便性は高い。

  14. 4. Stack を使う Stack<IDisposable> disp_stack = newStack<IDisposable>(); try{ Dispose01 disp_obj01 = newDispose01(); disp_stack.Push( disp_obj01 ); Dispose02 disp_obj02 = disp_obj01.GetChiled(); disp_stack.Push( disp_obj02 ); Dispose03 disp_obj03 = disp_obj02.GetChiled(); disp_stack.Push( disp_obj03 ); Console.WriteLine( "何か処理" ); }finally{ foreach( IDisposable stack_elem in disp_stack ){ stack_elem.Dispose(); } }

  15. まとめ • COMライブラリを扱うには、生成した IDispose オブジェクトをいかに成敗するかがキモ。 • 例外が発生した場合もきちんと処理しなければならない。 • Stackを使うとすげー便利

  16. 告知 • Stackモデルを発展させるといっぱしのフレームワークになる。 • このフレームワークを使うとC#からレイトバインドでExcelを叩けるようになる。 • わんくま名古屋#19(2011/10/29)でExcel制御フレームワークについて発表します!

More Related