Debug.Assert генерирует IL в режиме выпуска? - PullRequest
8 голосов
/ 03 апреля 2012

Когда в исходном коде существуют вызовы Debug.Assert() методов, и я компилирую в режиме выпуска, генерирует ли компилятор IL для Debug.Assert(), даже если он не вызывается?

Один из наших разработчиков недавно добавил Assert, который отображает информацию о нашей внутренней безопасности. Может ли кто-нибудь взглянуть на режим релиза IL и выяснить текст для assert?

Ответы [ 2 ]

9 голосов
/ 03 апреля 2012

По умолчанию не , если только вы не определили символ DEBUG (и по умолчанию для выпуска, который отключен).

Чтобы проверить, откройте свойства проекта и выберитеПанель сборки в Visual Studio.Появится флажок «Определить постоянную отладки».Если он включен для Release, то подтверждения активируются;в противном случае они не будут.

7 голосов
/ 03 апреля 2012

Нет, члены класса Debug (с атрибутом ConditionalAttribute) не излучают IL. нет явного упоминания в MSDN , однако следующие две цитаты довольно хорошо подразумевают поведение, поэтому для дополнения ответа Роя:

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

Таким образом, никакая разница в размере не подразумевает никакого вывода этих данных, и

Атрибут ConditionalAttribute применяется к методам отладки.Компиляторы, которые поддерживают ConditionalAttribute, игнорируют вызовы этих методов, если «DEBUG» не определен как символ условной компиляции.Обратитесь к документации компилятора, чтобы определить, поддерживается ли ConditionalAttribute, и синтаксису для определения условного символа компиляции.

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

...