IDisposable を成敗する

16
わわわわわわ わわわわわわ #18 IDisposable わわわわわ guicheng

description

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

Transcript of IDisposable を成敗する

Page 1: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

IDisposable を成敗する

guicheng

Page 2: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

• IDisposable オブジェクトは、使用したら確実に Dispose() しなければならない。– Dispose() し忘れるとメモリリークやゾンビ

プロセスが発生する。– 例外の考慮も必要。

• 特に、 COM ベースのライブラリを使用する場合は注意が必要。– Excel– LDAP– などなど

Page 3: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

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

Page 4: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

1. 普通に Dispose()

Dispose01 disp_obj = new Dispose01();

Console.WriteLine( " 何か処理 " );

disp_obj.Dispose();

Page 5: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

1. 普通に Dispose()• 利点

– 簡潔明瞭。誰でもわかる。• 欠点

– 例外が発生すると Dispose() されない。– Dispose() を書き忘れる場合がある。

• 変数が増えるととんでもないことになる。

Page 6: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

2. try-catch 構文を使う

Dispose01 disp_obj = null;try{

disp_obj = new Dispose01();Console.WriteLine( " 何か処理 " );

}catch{Console.WriteLine( " 例外処理 " );

}finally{if( disp_obj != null ){

disp_obj.Dispose();}

}

Page 7: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

2. try-catch 構文を使う• 利点

– 例外が発生しても確実に Dispose() を駆動できる。

• 欠点– ネストすると大変なことになる

• Excel を扱おうと思うとえらいことに……

Page 8: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

2. try-catch 構文を使うDispose01 disp_obj01 = null;try{

disp_obj01 = new Dispose01();

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

}

Page 9: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

3. using 構文を使う

try{using( Dispose01 disp_obj = new Dispose01() ){

Console.WriteLine( " 何か処理 " );}

}catch{Console.WriteLine( " 例外処理 " );

}

Page 10: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

3. using 構文を使う• 利点

– 確実に Dispose() できる– タイプ量が少ない

• 欠点– using() 内で例外が発生すると dispose() が

駆動しない– ネストが深くなる問題は変わらない

Page 11: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

3. using 構文を使う

try{using( Dispose01 disp_obj01 = new Dispose01() ){

using( Dispose02 disp_obj02 = disp_obj01.GetChiled() ){using( Dispose03 disp_obj02 = disp_obj02.GetChiled() ){

Console.WriteLine( " 何か処理 " );}

}}

}catch{Console.WriteLine( " 例外処理 " );

}

Page 12: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

4. Stack を使う

Stack<IDisposable> disp_stack = new Stack<IDisposable>();try{

Dispose01 disp_obj = new Dispose01();disp_stack.Push( disp_obj );Console.WriteLine( " 何か処理 " );

}finally{foreach( IDisposable stack_elem in disp_stack ){

stack_elem.Dispose();}

}

Page 13: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

4. Stack を使う• 利点

– 例外が発生しても確実に Dispose() できる。– 先入れ後出しで処理できる。– ネストが深くならない。

• 欠点– 生成したオブジェクトをスタックに Push()

しなければならない。• あとで Dispose() することと比較したら利便性は

高い。

Page 14: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

4. Stack を使うStack<IDisposable> disp_stack = new Stack<IDisposable>();try{

Dispose01 disp_obj01 = new Dispose01();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();

}}

Page 15: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

まとめ• COM ライブラリを扱うには、生成した

IDispose オブジェクトをいかに成敗するかがキモ。– 例外が発生した場合もきちんと処理しなけれ

ばならない。• Stack を使うとすげー便利

Page 16: IDisposable  を成敗する

わんくま同盟 名古屋勉強会 #18

告知• Stack モデルを発展させるといっぱしの

フレームワークになる。• このフレームワークを使うと C# からレ

イトバインドで Excel を叩けるようになる。

• わんくま名古屋 #19(2011/10/29) で Excel制御フレームワークについて発表します!