21

コード分​​析とコード コントラクトを組み合わせて使用​​すると、次のような多くの警告が表示されます

CA1062 : Microsoft.Design : 外部から見えるメソッド 'Foo.Bar(Log)' で、パラメーター 'log' を使用する前に検証してください。

Foo.Bar には、検証するコントラクトがありlogます。

public Bar(Log log)
{
   Contract.Requires(log != null);
   log.Lines.Add(...);
   // ...
}

FxCop にコード コントラクトを理解させる方法はありますか?

4

3 に答える 3

14

コントラクト リライターによって生成されたコードは、FxCop が探している標準パターンを生成しないため、現在のビルドでは可能ではないと思います。

通常、コード コントラクトを使用する場合は、この特定の FxCop ルールを無効にします。静的ベリファイアは、FxCop よりもはるかに積極的なチェックの欠如について叫ぶため、このルールの損失を補う以上のものであることがわかりました。ここで、この問題を解決する同じアプローチをお勧めします。

于 2010-06-01T14:53:39.850 に答える
3

はい、私の回答 hereで述べたように、フレームワークのバージョン 4.5.2 (おそらく 4.5) の時点で、コード コントラクトが適用されていることをコード分析に通知できます。拡張メソッドとマーカー属性クラスは、次のように定義する必要があります。

  public static class ContractExtensions {
    /// <summary>Throws <c>ContractException{name}</c> if <c>value</c> is null.</summary>
    /// <param name="value">Value to be tested.</param>
    /// <param name="name">Name of the parameter being tested, for use in the exception thrown.</param>
    [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "value")]
    [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "name")]
    [ContractAbbreviator] // Requires Assemble Mode = Standard Contract Requires
    public static void ContractedNotNull<T>([ValidatedNotNull]this T value, string name) where T : class {
      Contract.Requires(value != null,name);
    }
  }

/// <summary>Decorator for an incoming parameter that is contractually enforced as NotNull.</summary>
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
public sealed class ValidatedNotNullAttribute : global::System.Attribute {}

追加の詳細は、他の回答にあります。

于 2015-07-26T15:54:14.473 に答える
-2

次のように ArgumentNullException 例外を指定します。

public Bar(Log log)
{
   Contract.Requires<ArgumentNullException>(log != null);
   log.Lines.Add(...);
   // ...
}

Fxcop は ArgumentNullException 例外をスローすることを期待しています...

于 2010-12-19T13:07:54.370 に答える