web-dev-qa-db-ja.com

C#で「使用されない」および「割り当てられない」警告を抑制する

C#プロジェクトにHTTPSystemDefinitions.csファイルがあります。これは基本的に、マネージコードで使用するための古いWindows ISAPIを記述しています。

これには、ISAPIに関連するすべての構造や、コードによって消費される構造の完全なセットが含まれます。コンパイル時に、これらの構造体のすべてのフィールドメンバーが次のような警告を引き起こしています。

警告フィールド「UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.SetHeader」は決して割り当てられず、常にデフォルト値がnullになります

または

警告「UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.HttpStatus」フィールドは使用されません

これらは#pragma warning disableで無効にできますか?もしそうなら、対応するエラー番号は何でしょうか?そうでない場合、私にできることは他にありますか?私はこのファイルに対してこれを行うだけであることに注意してください。他のファイルからこれらのような警告が表示されることが重要です。

編集

構造体の例:-

struct HTTP_FILTER_PREPROC_HEADERS
{
    //
    //  For SF_NOTIFY_PREPROC_HEADERS, retrieves the specified header value.
    //  Header names should include the trailing ':'.  The special values
    //  'method', 'url' and 'version' can be used to retrieve the individual
    //  portions of the request line
    //

    internal GetHeaderDelegate GetHeader;
    internal SetHeaderDelegate SetHeader;
    internal AddHeaderDelegate AddHeader;

    UInt32  HttpStatus;               // New in 4.0, status for SEND_RESPONSE
    UInt32  dwReserved;               // New in 4.0
}
105
AnthonyWJones

はい、これらは抑制できます。

通常、私は警告を抑制することに反対しますが、この場合、相互運用に使用される構造体は、使用するつもりがない(または使用できない)にもかかわらず、いくつかのフィールドが存在することを絶対に必要とするため、この場合、それは正当化されるべきだと思います。

通常、これらの2つの警告を抑制するには、問題のあるコードを修正します。最初の( "... is never used")は、通常、以前のバージョンのコードからの残り物のコード臭です。おそらくコードは削除されましたが、フィールドは残っていました。

2番目は、通常、誤って使用されたフィールドのコード臭です。たとえば、プロパティの新しい値をプロパティ自体に誤って書き戻し、バッキングフィールドに書き込めないことがあります。


フィールドXYZは使用されない」の警告を抑制するには、次のようにします。

#pragma warning disable 0169
... field declaration
#pragma warning restore 0169

Field XYZは決して割り当てられず、常にデフォルト値XX」を表示するための警告を抑制するには、次のようにします。

#pragma warning disable 0649
... field declaration
#pragma warning restore 0649

このような警告番号を自分で見つけるには(つまり、0169と0649を使用することをどのように知りましたか)、次のようにします。

  • 通常どおりコードをコンパイルします。これにより、Visual Studioのエラーリストに警告が追加されます。
  • 出力ウィンドウとビルド出力に切り替えて、同じ警告を探します
  • 関連するメッセージから4桁の警告コードをコピーします。これは次のようになります。

    C:\ Dev\VS.NET\ConsoleApplication19\ConsoleApplication19\Program.cs(10,28):警告CS0649:フィールド「ConsoleApplication19.Program.dwReserved」は決して割り当てられず、常にデフォルト値0になります


警告@ Jon Hanna によるコメントによると、おそらくこれについてはいくつかの警告があります。この質問と回答。

  • 何よりもまず、警告を抑制する行為は、頭痛のために錠剤を飲み込むことに似ています。確かに、それは時には正しいことかもしれませんが、万能の解決策ではありません。時には、頭痛は、警告と同じように、マスクすべきではない本当の症状です。ビルド出力から警告を盲目的に削除するのではなく、原因を修正して警告を処理することを常に試みることが最善です。
  • とはいえ、警告を抑制する必要がある場合は、上記で説明したパターンに従ってください。最初のコード行、#pragma warning disable XYZK、そのファイルの残りの部分の警告を無効にします、または少なくとも対応する#pragma warning restore XYZK 見つかった。これらの警告を無効にする行の数を最小限にします。上記のパターンは、1行だけの警告を無効にします。
  • また、Jonが言及しているように、なぜこれを行っているのかについてのコメントは良い考えです。警告を無効にすることは間違いなくコードの臭いであり、理由なしに行われた場合、コメントは将来のメンテナーがなぜあなたがそれをしたのか疑問に思うか、それを削除して警告を修正しようとしても時間を費やすことを防ぎます。

これらの警告を修正する別の「解決策」は、構造体publicを作成することです。コンパイラはフィールドがアセンブリの外部で使用されている(割り当てられている)かどうかをコンパイラが認識できないため、警告は発行されません。

つまり、「相互運用」コンポーネントは通常パブリックではなく、internalまたはprivateである必要があります。

12
floele

VSにSystem.ComponentModel.INotifyPropertyChangedの実装スケルトンを生成させ、イベントはCS0067警告をトリガーするフィールドとして実装されました。

受け入れられた答えで与えられた解決策の代替としてフィールドをプロパティに変換し、警告が消えました

これは、プロパティ宣言の構文シュガーがフィールドにコンパイルされ、フィールドを参照するゲッターおよび/またはセッターメソッド(この場合は追加/削除)にコンパイルされるため、これは理にかなっています。これはコンパイラを満たし、警告は発生しません。

struct HTTP_FILTER_PREPROC_HEADERS
{
    //
    //  For SF_NOTIFY_PREPROC_HEADERS, retrieves the specified header value.
    //  Header names should include the trailing ':'.  The special values
    //  'method', 'url' and 'version' can be used to retrieve the individual
    //  portions of the request line
    //

    internal GetHeaderDelegate GetHeader {get;set;}
    internal SetHeaderDelegate SetHeader { get; set; }
    internal AddHeaderDelegate AddHeader { get; set; }

    UInt32 HttpStatus { get; set; }               // New in 4.0, status for SEND_RESPONSE
    UInt32 dwReserved { get; set; }               // New in 4.0
}
5
Pencho Ilchev

C/C++ユーザーには(void)var;未使用の変数の警告を抑制します。ビット演算子を使用して、C#で未使用の変数の警告を抑制することもできます。

        uint test1 = 12345;
        test1 |= 0; // test1 is still 12345

        bool test2 = true;
        test2 &= false; // test2 is now false

VS2010 C#4.0およびMono 2.10コンパイラでは、両方の式が未使用の変数警告を生成しません。

1
ceztko