Наткнулся на этот вопрос при исследовании контрактных кодов для нашей кодовой базы.Ответы здесь неполные.Размещаем это для дальнейшего использования.
Как бы заменить это контрактом кода?
Код довольно прост.Замените вашу проверку нуля времени выполнения этой строкой.Это создаст исключение типа 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 (хотя вы можетепереопределите это в свойствах вашего проекта).Так что да, вы можете сделать это.
Могут ли контракты кода сделать это вообще?Это хорошее применение для контрактов кода?
Краткий ответ - Да.