С# - Что делает метод Assert()? Это еще полезно?

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

Ответ 1

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

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

Ответ 2

Из полного кода

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

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

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

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

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

(...)

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Debug.Assert(x > 2)

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

Ответ 7

Прежде всего, метод 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 завершается ошибкой, вы получаете сообщение, показывающее текущую трассировку стека приложения. Этого не происходит в режиме Release, поскольку Trace.Assert() имеет значение true (i == 4).

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

Ответ 8

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

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

Ответ 9

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

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

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

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

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