In my current project I am using a library that is delivered to me. The API in this library provide an interface that is a bit big! The interface requires my class to implement two events as follows: #region INotifyPropertyChanged Members public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; #endregion These two events have no meaning in my class and I just have to implement them for the sake of the interface. As I start to compile my code I see the Warning CS0067 that indicates that my events are not used anywhere, which is true. As usual, I don't want my code gets spoiled with warnings en I would like to sort out ALL MY WARNINGS. So I came across some options:
イベントが定義されているインターフェイスを実装するとき、実装側でイベントを使わないと警告CS0067が出る。 うん、似たようなことを考える人はいるもんだ。 C# Warning CS0067: The event 'event' is never used interface INotice { event EventHandler Notice; } class Class1 : INotice class Class2 : INotice // イベントを使うメソッドを作っておけば警告は出ない class Class3 : INotice いずれにせよ、「このイベントは使われないよ!」ということをコメントなり何なりにきちんと残しておくべきだな。 スポンサーサイト
たまにコンパイラの警告レベルを落とさず、特定のコードでのみ警告を表示させないようにしたい時がある。 たとえば、以下のようなコードを示す。 [csharp] GeometryChangedイベントはIOrganizerに定義されていて、実装する必要がある。が、たまたまこのクラスでは不要だったとしよう。こういうことは往々にしてあると思う。 「いやいや、このイベントが必要なクラスと不要なクラスがあるという事自体が、まずい設計だということだ。インタフェースとしてうまく抽出できてないということだよ」という人も居るかもしれないが、そんなにちゃんとした設計ができてるような環境でぜひとも仕事してみたいもんだ。 で、まあ、こういう時は以下の様なエラーが出る。
こういう時は、「このクラスでは不要なのでこのイベントを使いません。よって警告を抑制します」という旨のコメントを書いて警告を抑制したい。結論から言うと、以下のようにすれば警告を抑制できる。 [csharp] public void Organize() (追記:上記コードは初出時「#pragma restore 0067」と書いていましたが、誤りだそうです。ご指摘ありがとうございました。修正しました) ここで、「0067」は警告に固有の番号であり、VSからだと「出力」ウィンドウに出てくる上記警告メッセージを参照すると分かる。上記では「CS0067」となっているが、「CS」は不要なようだ。 で、このコード、なんかすげー汚い。私は元来、こういう#pragmaとか、コンパイラに直接何かを命令して助けてもらうタイプの処理が、小手先のテクニックであるような気がしてすごく嫌いだ。なるべくなら使いたくないと思っている。加えて、この場合は2行も書かなくてはならず、更に汚く醜い。こういうコードは書きたくないが、こうする以外にやり方が分からなかった。 はじめは、SuppressMessage属性が使用できると思っていたのだけど、どうもこれはコード分析ツールや、FxCop、StyleCopツールから出力される警告は抑制できるようだが、コンパイラの警告は抑制してくれないようだ。 もっと簡潔な書き方は無いのだろうか。 |