Короче
Asserts
используются для охранников и для проверки проектирования по условиям контракта, а именно:
Asserts
должно быть только для отладочных и непроизводственных сборок. Утверждения обычно игнорируются компилятором в сборках Release.
Asserts
может проверять наличие ошибок / непредвиденных ситуаций, которые находятся под контролем вашей системы
Asserts
НЕ является механизмом для проверки первой строки пользовательского ввода или бизнес-правил
Asserts
следует не использовать для обнаружения непредвиденных условий окружающей среды (которые находятся вне контроля кода), например Недостаточно памяти, сбой сети, сбой базы данных и т. д. Хотя эти ситуации встречаются редко, их следует ожидать (и код вашего приложения не может исправить такие проблемы, как сбой оборудования или истощение ресурсов). Как правило, генерируются исключения - ваше приложение может либо предпринять корректирующие действия (например, повторить попытку базы данных или выполнить сетевую операцию, попытаться освободить кэшированную память), либо изящно прервать работу, если исключение не может быть обработано.
- Неудачное утверждение должно быть фатальным для вашей системы - т. Е. В отличие от исключения, не пытайтесь отлавливать или обрабатывать неудачные
Asserts
- ваш код работает на неожиданной территории. Следы стека и аварийные дампы могут использоваться для определения того, что пошло не так.
Утверждения имеют огромное преимущество:
- Чтобы помочь в поиске пропущенной проверки пользовательских входных данных или вышестоящих ошибок в коде более высокого уровня.
- Утверждения в базе кода четко передают читателю предположения, сделанные в коде
- Утверждение будет проверено во время выполнения в
Debug
сборках.
- После того, как код будет полностью протестирован, перестройка кода в виде Release устранит накладные расходы производительности при проверке предположения (но с тем преимуществом, что более поздняя сборка Debug всегда будет возвращать проверки при необходимости).
... Подробнее
Debug.Assert
выражает условие, которое было принято о состоянии оставшейся частью блока кода в управлении программой. Это может включать в себя состояние предоставленных параметров, состояние членов экземпляра класса или то, что возврат от вызова метода находится в его контрактном / разработанном диапазоне.
Как правило, утверждения должны приводить к аварийному завершению потока / процесса / программы со всей необходимой информацией (отслеживание стека, аварийный дамп и т. Д.), Поскольку они указывают на наличие ошибки или неучтенного условия, для которого не было разработано (то есть не пытаться поймать или обрабатывать ошибки подтверждения), с одним возможным исключением того, что само утверждение может нанести больше ущерба, чем ошибка (например, авиадиспетчеры не хотели бы YSOD, когда самолет идет на подводной лодке, хотя это спорный вопрос, следует ли развертывать отладочную сборку на производство ...)
Когда вы должны использовать Asserts?
- В любой точке системы, или API библиотеки, или службы, где входные данные для функции или состояния класса считаются действительными (например, когда проверка уже была произведена при вводе данных пользователем на уровне представления системы, бизнес и Классы уровня данных обычно предполагают, что проверки нуля, проверки диапазона, проверки длины строки и т. д. на входе уже выполнены)
- Общие проверки Assert
включают случаи, когда неверное допущение может привести к разыменованию нулевого объекта, делителю нуля, числовому или числовому арифметическому переполнению и общему внешнему / не предназначенному для поведения (например, если для моделирования использовалось 32-битное целое человеческому возрасту было бы благоразумно Assert
, что возраст на самом деле составляет от 0 до 125 или около того - значения от -100 до 10 ^ 10 не были рассчитаны).
.Кодовые контракты
В .Net Stack Кодовые контракты могут использоваться в дополнение или с использованием Debug.Assert
. Контракты на кодирование могут дополнительно формализовать проверку состояния и могут помочь в обнаружении нарушений допущений во время компиляции (или вскоре после этого, если они запускаются в качестве фоновой проверки в IDE).
Доступны проверки по контракту (DBC):
Contract.Requires
- Предварительные условия по контракту
Contract.Ensures
- Контрактные условия
Invariant
- Выражает предположение о состоянии объекта во всех точках его срока службы.
Contract.Assumes
- устанавливает статическую проверку, когда выполняется вызов неконтрактных методов.