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



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

1788   9  

9 ответов:

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

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

с Код

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

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

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

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

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

(...)

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

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

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

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

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

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

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

Debug.Assert(x > 2)

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

в первую очередь 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 во втором параметре, вы добавляете утверждение вокруг этого параметра, чтобы сообщить потребителю не делать этого.

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

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

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

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

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

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

Comments

    Ничего не найдено.