2

私が取り組んでいる小さなプロジェクトでコード分析を試した後、コードが分析的に準拠するように解決する際に、どれだけ厳しくする必要があるのか​​ 疑問に思っています。

私はこれに対する警告を抑制することができることを知っていますが、私にとって、警告をある程度抑制することはCop-outです(しゃれは意図されていません...「FXCop」)。

警告の例:

予期しない場所で例外を発生させない 'CustomObject.Equals(object)' は、タイプ 'ArgumentException' の例外を作成します。このタイプのメソッドでは例外を発生させないでください。この例外インスタンスが発生する可能性がある場合は、このメソッドのロジックを変更して、例外が発生しないようにします。

これを投げる理由は…

CustomObject.Equals(object) は、CustomObject を FooBarObject と比較しようとする場合があります...これらは同じ型ではないため、この場合、例外をスローするか、単に false を返す必要がありますか?


一般的に、自分のコードを完全に準拠させるために (より良い言葉が必要なため) 本当に肛門にすべきでしょうか? それとも、警告の抑制が必要になる状況に出くわすでしょうか?

4

1 に答える 1

5

FxCop の警告は単なる警告であり、無効なコードにフラグを立てることはありません。それがコンパイラの仕事です。FxCop が使用するルールは、長年にわたる .NET コードの作成経験から収集されました。それらは "ベスト プラクティス" を表し、一般に、意図しない結果や、CAS などの .NET プログラミングのあいまいな部分を思い出させるためにあります。

ルールが存在する理由を確認するには、常にドキュメントを参照してください。CA1065 の場合、次のように表示されます。

Equals メソッドは、例外をスローする代わりに、true または false を返す必要があります。たとえば、Equals に 2 つの一致しない型が渡された場合、ArgumentException をスローする代わりに false を返す必要があります。

これはあなたの使用法に正確に一致するため、アドバイスを採用するのに問題はありません. 残念ながら、ルールが作成された正確な理由については少し不足しています。これは、「予期しない場所に投げ込まないでください」というガイダンスを超えるものではありません。ここでの意図しない結果は、あなたのクラスを使用する別のプログラマーが、コードを失敗させたくない場合に try/catch が必要であることを認識しないことです。Equals メソッドに Debug.Assert() を自由に配置してください。アドバイスを無視したい場合はたくさんあります。たとえば、CA2000 は特に誤った警告を出しがちです。再度確認する必要がないように、必要に応じて [SuppressMessage] 属性を適用します。

于 2012-11-20T13:46:39.853 に答える