#if (DEBUG) VS System.Diagnostics.Debugger.IsAttached
#if DEBUG
is a compile-time check, meaning the code it surrounds will only be included in the output assembly if the DEBUG
preprocessor symbol is defined. Debugger.IsAttached
is a runtime check, so the debugging code still gets included in the assembly, but only executes if a debugger is attached to the process.
#if DEBUG
ensures the code is not included in the assembly at all in release builds. Also, code included by #if DEBUG
runs all the time in a debug build - not just when running under a debugger.
Debugger.IsAttached
means the code is included for both debug and release builds. And a debugger can be attached to release builds too.
It's common to use both together. #if DEBUG
is usually used for things like logging, or to reduce exception handling in internal test builds. Debugger.IsAttached
tends to just be used to decide whether to swallow exceptions or show them to a programmer - more of a programmer aid than anything else.
#if (DEBUG)
is a preprocessor directive that allows you to conditionally compile code.
System.Diagnostics.Debugger.IsAttached
provides a runtime value that indicates whether a debugger is attached to the process.