Кодовые контракты в C # и проверка нуля - PullRequest
5 голосов
/ 14 января 2011

В моем коде я делаю это много:

myfunction (parameter p)
{
  if(p == null)
   return;
}

Как бы я заменить это контрактом кода?

Мне интересно узнать, был ли передан нольв и получить его при статической проверке.

Я заинтересован в том, чтобы было сгенерировано исключение контракта, если во время нашего тестирования была передана пустая строка.

Могут ли контракты кода сделать это вообще?Это хорошее использование для контрактов кода?

Ответы [ 3 ]

6 голосов
/ 14 января 2011

Синтаксис для этого:

Contract.Requires(p != null);

Это должно быть в начале метода.Все Contract.Requires (и другие операторы договора) должны предшествовать всем другим операторам в методе.

1 голос
/ 19 мая 2016

Наткнулся на этот вопрос при исследовании контрактных кодов для нашей кодовой базы.Ответы здесь неполные.Размещаем это для дальнейшего использования.

Как бы заменить это контрактом кода?

Код довольно прост.Замените вашу проверку нуля времени выполнения этой строкой.Это создаст исключение типа System.Diagnostics.Contracts.ContractException (которое вы явно не можете отловить явно, если только вы не перехватите все исключения; оно не предназначено для перехвата во время выполнения).

Contract.Requires(p != null);

Мне интересночтобы выяснить, был ли передан нулевой тип и был ли он обнаружен статической проверкой.

Вы можете использовать плагин Microsoft для статического анализа Code Contract, найденный здесь .

Я заинтересован в том, чтобы исключение контракта выдавалось, если во время нашего тестирования было передано значение NULL

Используйте следующее сверху:

Contract.Requires(p != null);

В качестве альтернативы, если вы хотите создать другое исключение (например, ArgumentNullException), вы можете сделать следующее:

Contract.Requires<ArgumentNullException>(p != null, "Hey developer, p is null! That's a bug!");

Однако для этого требуется двоичный переписчик кодовых контрактов, который входит в комплект поставки. Код Контрактного плагина .

Для производства я хочу выйти из функции.

Насколько я понимаю, построение вашего проекта в режиме Release отключит проверку Code Contract (хотя вы можетепереопределите это в свойствах вашего проекта).Так что да, вы можете сделать это.

Могут ли контракты кода сделать это вообще?Это хорошее применение для контрактов кода?

Краткий ответ - Да.

1 голос
/ 14 января 2011

Эти сообщения здесь и здесь имеют множество отличных вариантов.

Редактировать: Я неправильно прочитал ваш пост в первый раз, думая, что вы вызывали исключение ArgumentNullException или что-то еще, пока не увидел комментарий Джона Скита. Я бы определенно предложил использовать хотя бы один из множества подходов, представленных в связанных вопросах.

Воспроизведение одного из ответов Джона Феминеллы здесь:

[Pure]
public static double GetDistance(Point p1, Point p2)
{
    CodeContract.RequiresAlways(p1 != null);
    CodeContract.RequiresAlways(p2 != null); 
    // ...
}
...