Landscape トップページ | < 前の日 2005-07-25 2005-07-28 次の日 2005-07-29 >

Landscape - エンジニアのメモ 2005-07-28

C# で危険なメソッドが呼ばれたときに警告を出す


* C# で危険なメソッドが呼ばれたときに警告を出す

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [C#] [.net] [プログラミング]

「使い方によっては危険なメソッド」が呼ばれたときに、呼んだプログラマに対してなんらかの警告を出したい。できるならば、プログラムを実行する前に。

- 危険なメソッドが呼ばれたら警告を出したい

C++ で書かれたとある通信用 DLL ファイルがある。その 通信用 DLL を直接呼ぶとリソースの管理やマーシャリングが面倒なので、C# でラッパーを書いた。そのラッパーは、いろんな開発者に渡して使ってもらうことになる。ただ、ラッパーのソースを渡すことはできないので、コンパイルしたアセンブリとして配布する。

その後、C++ で書かれた通信用 DLL の特定の関数にバグがあることがわかった。一定回数以上その関数を呼ぶと、エラーしか返らなくなるというものだ。その関数はラッパー上では DllImport 属性でインポートしているだけなので、もとの DLL のバグが修正されない限りはバグが発生する。バグに当たるのを避けるため、C# で作ったラッパーの利用者に「その関数を使うのは危険だよ、呼ぶのは一定回数以内で済む場合だけにしてね」という警告を出したい。

できれば、コーディング中にそのメソッドを呼ぶコードを書いたら警告を出すとか、もしくは、コンパイル時に警告を出すようにしたい。実行時に警告を出すのでは遅すぎる。さて、どうするのがいいだろう。

- Obsolete 属性を付ければ警告を出せるけど、意味が違う

後輩はラッパーの該当メソッドに Obsolete 属性を付けることでこの問題に対処した。

C# プログラマーズ リファレンス Obsolete
http://www.microsoft.com/japan/msdn/library/ja/csref/html/vc ...

これなら、このメソッドを呼んでいる場合、コンパイル時に警告が出る。期待する動作だ。でも、意味が違う。Obsolete は「もう使われていない,すたれた;時代[流行]遅れの;役に立たない,不用の」といった意味だ。将来的に削除予定のメソッドにつける属性を、期待する動作をするからといって付けてしまうのは美しくない。それを許したら、「警告を出す」という目的のために属性が使われてしまう。

何か他に良い属性は無いかと思い、MSDN のドキュメントを探してみたが、良さそうなものがない。Alert 属性とか Critical 属性とか Warning 属性とか、Danger 属性とか Notice 属性とかないのかなあ。syslog だとあと EMERG と ERR と DEBUG があるけど、それはいらないな。カスタム属性を作る? うーん、この一か所だけのためにそうするのは手間だなあ。

XML ドキュメントコメントの ///<summary> </summary> に警告文を書いておけば、インテリセンスには表示される。しかし、それだけだと XML ファイルが参照されなかったり、何らかの理由でインテリセンスが表示されなかったときに対応できない。2004-08-25 の「DataSet でインテリセンスが効かない」みたいな現象が起きたときに困る。

- #warning は期待する動作ではない

Google で 属性 警告 生成 C# を検索すると、@IT の文書がヒット。

連載:C#入門 第19回 プリプロセッサとドキュメント
http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_019/ ...
自作のエラーや警告を発する

込み入ったプログラムを記述していると、C#の文法エラーではないが、プログラムの意図として間違いだとプログラマに伝えたい場合がある。特に個人ではなくチームで開発していると、他のプログラマに間違った使い方をさせないために、このような措置が必要とされることがある。これを実現するために、C#のプリプロセッサには、警告を発する「#warning」と、エラーを発する「#error」が用意されている。以下はそれを用いた例である。

#warning ってのがあるのか。なになに、以下のようにソース中に書くと、続く文字列を警告してくれると。

#warning This is a sample warning.

よしやってみよう。警告文をソース中に埋めて、と。あ、VS.NET 2003は 警告文に下線まで引いてくれるのね。コンパイル。おおっ、ちゃんと警告が出たー! 警告文字列は日本語でも大丈夫なんだね。って、ちょっと待て。これって危険なメソッドを呼んだ方のソースのコンパイル時じゃなくて、元のソースがコンパイルされたときに警告されるわけじゃん。いや、私はこのメソッドの危険性はわかってるんだってば。このメソッドを含んだ DLL の利用者に警告を送りたいのに、これじゃ意味がない。

- もう Obsolete 属性でいいよ

MVP (Microsoft Most Valuable Professional) の C# を持ってる人に聞いたり、Web の文書を探してみたが、結局有効な代案を見つけられなかった。私は実利主義。仕方がないので結局 Obsolete 属性を付けることにした。ただ、///<summary> </summary> のコメントには、Obsolete 属性を付けてるけど削除予定はないよ、ということを記述した。

すべての記事の見出し (全1029件)
全カテゴリの一覧と記事の数
カテゴリごとに記事をまとめ読みできます。記事の表題だけを見たい場合は、すべての記事の見出し (カテゴリ別表示) へ。

直近30日分の記事
2007-04-23 (Mon)
2007-03-07 (Wed)
2007-02-27 (Tue)
2007-01-17 (Wed)
2007-01-15 (Mon)
2007-01-14 (Sun)
2007-01-08 (Mon)
2006-12-01 (Fri)
2006-11-22 (Wed)
2006-11-20 (Mon)
2006-11-19 (Sun)
2006-09-30 (Sat)
2006-08-29 (Tue)
2006-08-04 (Fri)
2006-07-27 (Thu)
2006-07-23 (Sun)
2006-07-17 (Mon)
2006-07-10 (Mon)
2006-07-06 (Thu)
2006-07-03 (Mon)
2006-06-29 (Thu)
2006-06-28 (Wed)
2006-06-27 (Tue)
2006-06-25 (Sun)
2006-06-19 (Mon)
2006-06-18 (Sun)
2006-06-15 (Thu)
2006-06-11 (Sun)
2006-06-01 (Thu)
2006-05-30 (Tue)
プロファイル
斎藤 宏明。エンジニアです。宇都宮市に住んでいます。
リンク
RSS
スポンサードリンク
Powered by
さくらインターネット

© 斎藤 宏明 Saito Hiroaki Gmail Address
Landscape - エンジニアのメモ http://sonic64.com/
Landscape はランドスケープと読みます。
ひらがなだと らんどすけーぷ です。