スライド 1

IDisposable を成敗する
guicheng
わんくま同盟 名古屋勉強会 #18
• IDisposable オブジェクトは、使用したら確実
にDispose() しなければならない。
– Dispose() し忘れるとメモリリークやゾンビプロセ
スが発生する。
– 例外の考慮も必要。
• 特に、COMベースのライブラリを使用する場
合は注意が必要。
– Excel
– LDAP
– などなど
わんくま同盟 名古屋勉強会 #18
んじゃ、どうやって
IDisposable オブジェクト
を成敗するか。
わんくま同盟 名古屋勉強会 #18
1. 普通に Dispose()
Dispose01 disp_obj = new Dispose01();
Console.WriteLine( "何か処理" );
disp_obj.Dispose();
わんくま同盟 名古屋勉強会 #18
1. 普通に Dispose()
• 利点
– 簡潔明瞭。誰でもわかる。
• 欠点
– 例外が発生するとDispose()されない。
– Dispose()を書き忘れる場合がある。
• 変数が増えるととんでもないことになる。
わんくま同盟 名古屋勉強会 #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();
}
}
わんくま同盟 名古屋勉強会 #18
2. try-catch 構文を使う
• 利点
– 例外が発生しても確実にDispose()を駆動できる。
• 欠点
– ネストすると大変なことになる
• Excel を扱おうと思うとえらいことに……
わんくま同盟 名古屋勉強会 #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();
}
}
わんくま同盟 名古屋勉強会 #18
3. using 構文を使う
try{
using( Dispose01 disp_obj = new Dispose01() )
{
Console.WriteLine( "何か処理" );
}
}catch{
Console.WriteLine( "例外処理" );
}
わんくま同盟 名古屋勉強会 #18
3. using 構文を使う
• 利点
– 確実にDispose()できる
– タイプ量が少ない
• 欠点
– using()内で例外が発生すると dispose() が駆動
しない
– ネストが深くなる問題は変わらない
わんくま同盟 名古屋勉強会 #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( "例外処理" );
}
わんくま同盟 名古屋勉強会 #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();
}
}
わんくま同盟 名古屋勉強会 #18
4. Stack を使う
• 利点
– 例外が発生しても確実にDispose()できる。
– 先入れ後出しで処理できる。
– ネストが深くならない。
• 欠点
– 生成したオブジェクトをスタックに Push() しなけ
ればならない。
• あとでDispose()することと比較したら利便性は高い。
わんくま同盟 名古屋勉強会 #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();
}
}
わんくま同盟 名古屋勉強会 #18
まとめ
• COMライブラリを扱うには、生成した
IDispose オブジェクトをいかに成敗するかが
キモ。
– 例外が発生した場合もきちんと処理しなければな
らない。
• Stackを使うとすげー便利
わんくま同盟 名古屋勉強会 #18
告知
• Stackモデルを発展させるといっぱしのフレー
ムワークになる。
• このフレームワークを使うとC#からレイトバイ
ンドでExcelを叩けるようになる。
• わんくま名古屋#19(2011/10/29)でExcel制
御フレームワークについて発表します!
わんくま同盟 名古屋勉強会 #18