Need .NET code to execute only when in debug configuration

Solutions

You can use one of the following—

1: Conditional attribute

The Conditional attribute indicates to compilers that a method call or attribute should be ignored unless a specified conditional compilation symbol is defined.

Code example:

[Conditional("DEBUG")]
static void Method() { } 

1b: Conditional attribute on local function (C# 9)

Since C# 9, you may use attribute on a local function.

Code example:

static void Main(string[] args)
{
    [Conditional("DEBUG")]
    static void Method() { }

    Method();
}

2: #if preprocessor directive

When the C# compiler encounters an #if preprocessor directive, followed eventually by an #endif directive, it compiles the code between the directives only if the specified symbol is defined. Unlike C and C++, you cannot assign a numeric value to a symbol. The #if statement in C# is Boolean and only tests whether the symbol has been defined or not.

Code example:

#if DEBUG
    static int testCounter = 0;
#endif 

3: Debug.Write methods

Debug.Write (and Debug.WriteLine) writes information about the debug to the trace listeners in the Listeners collection.

See also Debug.WriteIf and Debug.WriteLineIf.

Code example:

Debug.Write("Something to write in Output window.");

Notes

Beware of using #if directive since it can produce unintended situations in non-Debug (e.g. Release) build. For example, see:

    string sth = null;
#if DEBUG
    sth = "oh, hi!";
#endif
    Console.WriteLine(sth);

In this case, non-Debug build will print a blank message. But, this potentially may raise NullReferenceException in a different case.

Read more

  • Eric Lippert. What’s the difference between conditional compilation and the conditional attribute?
  • C# Programmer’s Reference: Conditional Methods Tutorial (archive.org mirror)
  • Bill Wagner. Effective C#: 50 Specific Ways to Improve Your C# (book), chapter: Use Conditional Attributes Instead of #if
  • John Robbins. Assertions and Tracing in .NET (archive.org mirror)
  • Sam Allen. Dot Not Perls:
    • C# Conditional Attribute
    • C# Debug.Write

See also

There is also a tool, DebugView, which allow to capture debug information from external applications.

Leave a Comment