Чем отличается использование #if (DEBUG)
и System.Diagnostics.Debugger.IsAttached
в визуальной студии? Существуют ли случаи, когда флаг DEBUG
установлен, но не подключен отладчик или случаи, когда отладчик может быть присоединен, когда флаг DEBUG
не установлен?
#if (DEBUG) VS System.Diagnostics.Debugger.IsAttached
Ответ 1
#if DEBUG
гарантирует, что код вообще не включается в сборку в сборках релизов. Кроме того, код, включенный #if DEBUG
работает все время в сборке отладки, а не только при работе под отладчиком.
Debugger.IsAttached
означает, что код включен, будь то отладка или выпуск. И отладчик может быть подключен к релизу сборок.
Общепринято использовать оба метода. #if DEBUG
обычно используется для таких вещей, как ведение журнала, или для уменьшения обработки исключений во внутренних тестовых сборках. Debugger.IsAttached
имеет тенденцию просто использоваться для принятия решения о том, следует ли проглатывать исключения или показывать их программисту - больше программной помощи, чем что-либо еще.
Ответ 2
#if DEBUG
- это проверка времени компиляции, то есть код, который он окружает, будет включен только в выходную сборку, если определен символ препроцессора DEBUG
. Debugger.IsAttached
- это проверка времени выполнения, поэтому код отладки по-прежнему включается в сборку, но выполняется только в том случае, если к процессу прикреплен отладчик.
Ответ 3
#if (DEBUG)
- это препроцессорная директива, позволяющая условно компилировать код.
System.Diagnostics.Debugger.IsAttached
предоставляет значение времени выполнения, которое указывает, подключен ли отладчик к процессу.
Ответ 4
Это не имеет ничего общего. Вы можете отлаживать сборку Release. И вы можете запустить сборку Debug без отладчика, нажмите Ctrl + F5.
Ответ 5
Условные атрибуты - это еще одна связанная опция с перечисленными выше. Хорошие ответы, связанные с этой темой по этому вопросу.
Нужно, чтобы код.NET выполнялся только в конфигурации отладки
Ответ 6
private void ConfigureOAuthTokenConsumption(IAppBuilder app)
{
#if DEBUG
AuthenticateViaAppOwnIdentity(app);
#else
AuthenticateViaAzureAD(app);
#endif
}
С помощью этого кода просто попробуйте изменить сборку от debug до release и наоборот. Код запуска/исключения будет отображаться измененным в VS автоматически, как черный и серый, соответственно