Подтвердить что ты не робот

Можно ли понять, как Code Code понимает кодовые контракты?

При использовании Code Analysis и Code Contracts в сочетании, я получаю много предупреждений, таких как

CA1062: Microsoft.Design: во внешнем видимом методе 'Foo.Bar(Log)', прежде чем использовать его, проверьте параметр 'log'.

В Foo.Bar у меня есть контракт, который проверяет log.

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

Есть ли способ заставить FxCop понимать кодовые контракты?

4b9b3361

Ответ 1

Нет. Я не думаю, что это возможно в текущей сборке, поскольку код, созданный с помощью перезаписывающего контракта, не создает стандартный шаблон, который ищет FxCop.

Как правило, я отключу это правило FxCop при использовании кодовых контрактов. Я считаю, что статический верификатор больше, чем компенсирует потерю этого правила, поскольку он будет кричать об отсутствии проверки гораздо более агрессивно, чем FxCop. Я бы предложил тот же подход, который поможет вам решить эту проблему.

Ответ 2

Да, как указано в моем ответе здесь, с версии 4.5.2 структуры (возможно, 4.5) можно сообщить Code Analysis of Code Contracts в силу. Метод расширения и класс атрибута маркера должны быть определены следующим образом:

  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 {}

Дополнительная информация приведена в моем другом ответе.

Ответ 3

Укажите исключение ArgumentNullException следующим образом:

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

Fxcop ожидает выброса исключения ArgumentNullException...