C# - что делает метод Assert ()? Он все еще полезен?

Я отлаживаю точки останова, и я понимаю вызов assert? Я думал, это только для модульных тестов. Что он делает больше, чем точка останова? Поскольку я могу breakpoint, почему я должен использовать Assert?

9 ответов


в отладочной компиляции, Assert принимает логическое условие в качестве параметра и показывает диалоговое окно ошибки, если условие false. Программа продолжается без каких-либо перерывов, если условие истинно.

Если вы компилируете в выпуске, all Debug.Assertавтоматически опущены.


с Код

8 Защитное Программирование

8.2 утверждения

утверждение-это код, который используется во время разработки-обычно это рутина или макрос-это позволяет программе проверять себя по мере ее запуска. Когда утверждение верно, это означает, что все работает так, как ожидалось. Когда это false, это означает, что он обнаружил неожиданную ошибку в код. Например, если система предполагает, что информация о клиентах файл никогда не будет иметь более 50 000 записей, программа может содержать утверждение о том, что количество записей меньше, чем или равно до 50 000. Если количество записей меньше или равно 50,000 утверждение будет молчать. Если он встречает более 50,000 записей, однако, он будет громко "утверждать", что есть ошибка в программе.

утверждения особенно полезны в больших, сложных программ и в высоком программы надежности. Они позволяют программистам быстрее смыть несоответствующие предположения интерфейса, ошибки, которые ползут, когда код модифицируется, и так далее.

утверждение обычно принимает два аргумента: логическое выражение, описывает предположение, которое должно быть истинным, и сообщение покажите, если это не так.

(...)

обычно вы не хотите, чтобы пользователи видели сообщения об утверждении в производственный код; утверждения главным образом для пользы во время развития и обслуживание. Утверждения обычно компилируются в код на время разработки и скомпилированный из кода для производства. В течение развитие, утверждения вытесняют противоречивые предположения, неожиданные условия, плохие значения, переданные подпрограммам, и так далее. Во время производства они компилируются из кода так, чтобы утверждения не снижают производительность системы.


вы должны использовать его для случаев, когда вы не хотите иметь точку останова каждой маленькой строки кода для проверки переменных, но вы хотите получить какую-то обратную связь, если присутствуют определенные ситуации, например:

Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");

Assert также дает вам еще одну возможность посмеяться над навыками дизайна пользовательского интерфейса Microsoft. Я имею в виду: диалог с тремя кнопками Abort, Retry, Ignore и объяснение того, как их интерпретировать в строке заголовка!


Assert позволяет утверждать, что условие (post или pre) применяется в вашем коде. Это способ документирования ваших намерений и получения отладчика с диалоговым окном, если ваше намерение не выполнено.

В отличие от точки останова, Assert идет с вашим кодом и может использоваться для добавления дополнительной информации о вашем намерении.


Assert может помочь вам дать отдельное поведение обмена сообщениями между тестированием и выпуском. Например,

Debug.Assert(x > 2)

вызовет только разрыв, если вы используете сборку" debug", а не сборку выпуска. Существует полный пример такого поведения здесь


в первую очередь Assert() метод доступен для Trace и Debug классы.
Debug.Assert() выполняется только в режиме отладки.
Trace.Assert() выполняется в режиме отладки и в режиме релиза.

вот пример:

        int i = 1 + 3;
        // Debug.Assert method in Debug mode fails, since i == 4
        Debug.Assert(i == 3);
        Debug.WriteLine(i == 3, "i is equal to 3");

        // Trace.Assert method in Release mode is not failing.
        Trace.Assert(i == 4);
        Trace.WriteLine(i == 4, "i is equla to 4");

        Console.WriteLine("Press a key to continue...");
        Console.ReadLine();

запустите этот код в режиме отладки, а затем в режиме выпуска.

enter image description here

Вы заметите, что в режиме отладки кода Debug.Assert оператор терпит неудачу, вы получаете окно сообщения отображение текущей трассировки стека приложения. Это не происходит в режиме выпуска, так как Trace.Assert() условие истинно (i == 4).

WriteLine() метод просто дает вам возможность регистрации информации в вывод Visual Studio. enter image description here


Как я думаю, это отладка.Assert-это способ установить контракт о том, как должен быть вызван метод, сосредоточившись на особенностях значений параметра (а не только типа). Например, если вы не должны отправлять null во втором параметре, вы добавляете Assert вокруг этого параметра, чтобы сказать потребителю не делать этого.

Это мешает кому-то использовать ваш код тупым способом. Но это также позволяет этому тупоголовому способу пройти через производство и не давать неприятное сообщение клиенту (предполагая, что вы создаете сборку выпуска).


утверждения имеют большое значение в дизайне по контракту (DbC), который, как я понимаю, был введен/одобрен Мейером, Бертандом. 1997. Объектно-Ориентированное Программное Обеспечение.

важной особенностью является то, что они не должны создавать побочные эффекты, например, вы можете обрабатывать исключение или принимать другой курс действий с помощью оператора if(защитное Программирование).

утверждения используются для проверки условий контракта до / после, отношения клиент / поставщик - клиент должен убедиться, что условия поставщика выполнены, например. отправляет £5, и поставщик должен гарантировать, что пост-условия выполнены, например. обеспечивает 12 роз. (Просто простое объяснение клиента / поставщика-может принимать меньше и поставлять больше, но об утверждениях). C# также вводит следа.Assert (), который может использоваться для кода выпуска.

ответить на вопрос да они все еще полезны, но могут добавить сложность + читаемость кода и время + трудно поддерживать. Должны ли мы все еще ... использовать их? Да, Мы все ими пользуемся? Вероятно, нет, или не в той степени, как описывает Мейер.

(даже курс ou Java, на котором я изучил эту технику, показал только простые примеры, а остальной код не применял правила утверждения DbC на большей части кода, но предполагалось, что он будет использоваться для обеспечения правильности программы!)