#if (DEBUG) VS System.Diagnostics.Debugger.IsAttached

Чем отличается использование #if (DEBUG) и System.Diagnostics.Debugger.IsAttached в визуальной студии? Существуют ли случаи, когда флаг DEBUG установлен, но не подключен отладчик или случаи, когда отладчик может быть присоединен, когда флаг DEBUG не установлен?

Ответ 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.

Ответ 6

        private void ConfigureOAuthTokenConsumption(IAppBuilder app)
        {
#if DEBUG
            AuthenticateViaAppOwnIdentity(app);
#else
AuthenticateViaAzureAD(app);
#endif    
        }

С помощью этого кода просто попробуйте изменить сборку от debug до release и наоборот. Код запуска/исключения будет отображаться измененным в VS автоматически, как черный и серый, соответственно