115

私は 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
}
4

4 に答える 4

204

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

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

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

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


「 Field XYZ is never used 」の警告を抑制するには、次のようにします。

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

" Field XYZ is never assigned to, and will will always have its default value 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): 警告 CS 0649 : フィールド 'ConsoleApplication19.Program.dwReserved' は決して割り当てられず、常にデフォルト値 0 になります


警告: @Jon Hannaのコメントによると、この質問と回答の将来の発見者のために、おそらくいくつかの警告が必要です。

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

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

とはいえ、「相互運用」コンポーネントは通常、パブリックではなくinternal、またはprivate.

于 2012-09-27T09:54:26.663 に答える
6

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

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

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

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
}
于 2012-01-06T16:33:16.257 に答える
1

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 コンパイラでは未使用の変数の警告を生成しません。

于 2014-05-12T21:32:21.263 に答える