IDisposableの位置付け
先日こんなのを見つけて読んでしまいました.
http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=4718
なかなか読み応えのある内容で,読み終わったのが朝の4時,おかげでその日一日寝不足状態でした.
議論に参加されている方もビッグネーム揃いで正直この議論は収束するの?って感じでしたが,途中からhidoriさんが収束に向けて動き出し,結局収束した……のかな?
SqlConnectionクラスをあえて例に挙げると,SqlConnectionはIDisposableインタフェースを実装するのでDisposeメソッドを持っています.一方でCloseメソッドもあって,両者は同じ動作をするはず……なんだけど実際は微妙に違うと(無視してよいレベルではありますが).
- (あなたは)Disposeを使いますか?
- (あなたは)Closeを使いますか?
- (あなたは)両方(Closeの後でDispose)使いますか?
- (あなたは)なにも使いませんか?
であれば,まぁ好きなほうを選択すれば?で済むのですが,
- (入門者に)Disposeを使わせますか?
- (入門者に)Closeを使わせますか?
- (入門者に)両方(Closeの後でDispose)使わせますか?
- (入門者に)なにも使わせませんか?
という"ひとひねり"があるのがクセモノですね.
自分自身がどういう実装をしていたかというと,基本的にはusingを使いたいので1です.Closeを使わないでDisposeというのは感覚的にイヤ,という気持ちはよく分かっていてusingのブロックを抜ける際にはCloseが呼ばれるのだ,と自分自身を納得させて(ごまかして)使用しています.ただ気分によって2や3の書き方をすることもあります(2や3で書かれた既存のコードを1にするということはしません)
議論の中で気になった2点.
1点目は,マニュアル・ドキュメントをよく読む(読ませる)べし,というのがあるのですが,僕自身は読みたくも書きたくもないほうなんで,どうなんだろう?と思いました.直感的でマニュアルを読まなくてもバグの入りこみにくいのが理想かな.
だから自分が教える立場だったらまっさらな初心者には1を,Cなんかの経験者には2かな.で,usingを教える.usingを抜ける際に1の人にはDisposeが呼ばれると教え,2の人にはCloseが呼ばれるとウソをつく……と.(いずれは本当のことを教えますが)
2点目は,インタフェースという単語もJavaをやってきた人とCOMをやってきた人では微妙なニュアンスの違いがあるんだろうな,と思いました.僕自身はCOMをよく知らないのでなんともいえないのですが,議論のところどころ(特にインタフェースのセマンティクス云々のところ)に自分の感覚にはない考えがあったので.その辺も一般教養として知っておいたほうが良いのかもしれませんが……いまのところ勉強する気にはなれないかな?
ともあれ,いずれを選択するにせよ,C#の中級者以上はこの議論を一度は目を通しておくべきだと思います.現プロジェクトにもポストしておこうかな