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