Подтвердить что ты не робот

Должны ли Debug.Assert и Debug.Fail использоваться либерально, и должны ли они быть оставлены в производственном коде?

Я читаю книгу, которая утверждает (каламбур). "Вы должны загружать свой код с помощью методов Debug.Assert, где бы вы не имели условие, которое всегда будет истинным или ложным".

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

Мысли?

4b9b3361

Ответ 1

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

Debug.Assert(SomethingImportantThatMustExecute());

bad - SomethingImportantThatMustExecute будет проигнорирован в выпуске; вы должны использовать:

bool result = SomethingImportantThatMustExecute()
Debug.Assert(result);

В принципе, избегайте побочных эффектов при вызовах условных методов и частичных методов.

Ответ 2

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

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

if (foo == null)
{
    throw new ArgumentNullException("foo");
}

По моему мнению, это поведение не должно меняться только потому, что вы используете код выпуска.

Ответ 3

Если вы скомпилируете сборку Release (с использованием настройки проекта Visual Studio), все операторы Debug.Assert будут автоматически удалены. Так что да, используйте их либерально.

Ответ 4

Да, утверждения в порядке. И обратите внимание, что это не только логические проверки (что очевидно), но и служат формой документации, более надежной, чем комментарии.

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

Для проверок, которые вы хотите быть активными в сборке Release, вы можете использовать Trace.Assert().

И никто не упомянул Кодовые контракты, более богатый и более структурированный способ проверки и документирования вашего кода.

Ответ 5

Вы можете использовать Debug.Assert свободно в базовых базовых кодах. Debug.Assert украшен ConditionalAttribute. Если вы скомпилируете свой код в конфигурации "realease", компилятор пропустит вызов Debug.Assert.