Должны ли Debug.Assert и Debug.Fail использоваться свободно и должны ли они быть оставлены в рабочем коде? - PullRequest
17 голосов
/ 09 июня 2011

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

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

Мысли

Ответы [ 5 ]

36 голосов
/ 09 июня 2011

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

Debug.Assert(SomethingImportantThatMustExecute());

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

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

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

11 голосов
/ 09 июня 2011

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

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

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

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

3 голосов
/ 09 июня 2011

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

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

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

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

3 голосов
/ 09 июня 2011

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

2 голосов
/ 09 июня 2011

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

...