Visual Studioで「[一部のイベント]未使用」のコンパイラ警告を取り除くにはどうすればよいですか?


93

たとえば、私はこのコンパイラ警告を受け取ります、

イベント「Company.SomeControl.SearchClick」は使用されません。

しかし、コメントアウトすると、このイベントを使用しようとしているXAMLページの20の新しい警告のようにスローされるので、それが使用されていることはわかっています。

何ができますか?この警告を取り除くトリックはありますか?


1
例を投稿していただけませんか?
ジョンサンダース、

回答:


143

これは警告67のようであり、次のようにして抑制できます。

#pragma warning disable 67

(イベント宣言の後)できるだけ早くそれを復元することを忘れないでください:

#pragma warning restore 67

ただし、もう一度チェックして、イベントをサブスクライブするだけでなく、どこかでイベントを発生させていることを確認します。コンパイラは20回の吐き出すという事実の警告ではなく20 エラーをあなたがイベントをコメントアウトするときにも疑わしいです...

この警告についての興味深い記事もあり、具体的にはそれがインターフェイスにどのように適用されるかを示しています。「未使用」のイベントを処理する方法についての良い提案があります。重要な部分は次のとおりです。

正しい答えは、イベントに何を期待するかを明確にすることです。この場合は何も起こりません。

public event EventHandler Unimportant
{
    add { }
    remove { }
}

これにより、警告だけでなく、コンパイラが生成した通常のイベントの追加の実装も完全に抑制されます。もう1つの追加の利点として、この何もしない実装が本当に最良の実装であるかどうかを考えるように促します。たとえば、イベントがサポートされていないほど重要ではない場合、その機能に依存するクライアントはイベントがなければ失敗する可能性が高いため、サポートの欠如を明示的に示し、例外:

public event EventHandler Unsupported
{
    add { throw new NotSupportedException(); }
    remove { }
}

もちろん、その機能の一部がなくても便利に実装できるインターフェースは、インターフェースが最適にまとまりがなく、個別のインターフェースに分割する必要があることを示す場合があります。


それがまさに私が必要としていることです!ありがとうございました!唯一の違いは、67の横に自分のコメントを追加したことです。ここに私が入力した「正確に」があります... #pragma warning disable 67 //イベントはパブリックイベントを使用していませんRoutedEventHandler SearchClick; #pragma warning restore 67
jedmao

12
それは素晴らしいリンクです。ありがとう。
Max Palmer

これは便利です。その場に留まるつもりはありませんが、現在のアイデアを実行するための何か...
dudeNumber4

78

インターフェースからイベントを実装する必要がある場合は、実装に必要がないため、次のようにして警告を回避できます。

public event EventHandler CanExecuteChanged { add{} remove{} }

これを行うと、後でファイルでif(OnCompleteOpenEvent != null) OnCompleteOpenEvent();「OnCompleteEventは現在のコンテキストに存在しません」と表示されます。
アルモ2014

@アルモ、それは正しいです。ただし、イベントを使用しているため、警告が表示されないため、修正プログラムを使用しない場合について説明しています。正しい?通常、イベントと2つのサブクラスを指定するインターフェースがあります。1つはイベントを使用せず、このソリューションを使用します。もう1つはイベントを使用し、最初から警告をスローしませんでした。
Dirk Bester、2014

長すぎますが、使用されているにもかかわらず、このエラーが発生しました。コンパイラがだまされて、使用されていないと思わせるような方法で定義されていることと関係がありました。
アルモ2014

非常に厄介な状況に対するこの簡単な解決策をありがとうございました!
M463

14

2番目の最良の方法は、誰かがイベントをサブスクライブしようとした場合に例外をスローすることにより、イベントがサポートされていないことを明確に示すことです。

public event RoutedEventHandler SearchClick
{
    add { throw new NotSupportedException(); }
    remove { throw new NotSupportedException(); }
}

これのバリエーションとして、addおよびremoveメソッドを空のままにして、イベントのサブスクリプションを暗黙的に無視することもできます。

最善の解決策は、コードをリファクタリングすることです。可能であれば、イベントの宣言を実装者にプルすることもできます。

最後の手段として、このように警告を無効にすることもできます

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67

私はここでは関係あるかヌルオブジェクトが表示されない
vidstige

nullオブジェクトとは何か知っています。この使用例については、最後の段落で説明します。回答全体を注意深くお読みください。
vidstige

nullオブジェクトとは何かを知っています。この使用例は、最後の段落でカバーされていると思います。
vidstige 2018

3

次のこともできます。

public event EventHandler MyEvent = delegate {}

1

コンパイラーは、XAMLコードで使用されていることを明らかに認識していません。イベント定義で警告を抑制してみてください。

また、イベントを実際にどこかで発生させていることを確認してください。


それも私が考えたことなので、XAMLコードを背後のコードに移動しましたが、同じ警告が表示されました!そして、はい、イベントがどこかで発生していると私は100%確信しています。私はそれを正しく見ています。ボタンに接続されています。
jedmao 2009

1

個別の警告を抑制することができます。

\Program.cs(13,20): warning CS0219: The variable 'foo' is assigned but its value is never used

この場合、CS0219は、割り当てられているが使用されていない変数に関する警告です。/ nowarn:0219フラグを使用するか、プロジェクトのプロパティペインにエラー番号を追加できます([ビルド]の下で、先頭のCSを削除してください)。このクラスのすべての警告が抑制されることに注意してください。


1

または<NoWarn>67</NoWarn>、プロジェクトに追加できます

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>

9
これにより、プロジェクト全体の警告が無効になり、未使用のイベントの実際の問題が潜在的に非表示になります。
vidstige 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.