What is if/then directives for debug vs release in C#?

In C#, conditional compilation directives like #if DEBUG allow you to include or exclude code based on the build configuration. Visual Studio provides two main build configurations: Debug mode for development and debugging, and Release mode for final production builds.

The #if DEBUG directive enables code to execute only when compiled in Debug mode. In Release mode, this code is completely excluded from compilation, making it useful for debugging statements, logging, and development-only features.

Syntax

Following is the basic syntax for conditional compilation directives −

#if DEBUG
    // Code executed only in Debug mode
#endif

#if DEBUG
    // Debug-specific code
#else
    // Release-specific code
#endif

How Debug vs Release Mode Works

When you build your project, the compiler automatically defines certain symbols based on the configuration:

  • Debug mode: The DEBUG symbol is defined, so #if DEBUG evaluates to true

  • Release mode: The DEBUG symbol is not defined, so #if DEBUG evaluates to false

To change the build configuration, go to Build ? Configuration Manager and select Debug or Release, or use the dropdown in the Visual Studio toolbar.

Using DEBUG Directive

Example

using System;

class Program {
    static void Main(string[] args) {
        Console.WriteLine("Application started");
        
        #if DEBUG
            Console.WriteLine("Mode=Debug");
            Console.WriteLine("Debug information enabled");
        #else
            Console.WriteLine("Mode=Release");
            Console.WriteLine("Optimized for production");
        #endif
        
        Console.WriteLine("Application finished");
    }
}

The output when compiled in Debug mode −

Application started
Mode=Debug
Debug information enabled
Application finished

The output when compiled in Release mode −

Application started
Mode=Release
Optimized for production
Application finished

Practical Use Cases

Debug Logging Example

using System;

class DataProcessor {
    public void ProcessData(int[] data) {
        #if DEBUG
            Console.WriteLine($"Processing {data.Length} items");
            Console.WriteLine($"First item: {data[0]}, Last item: {data[data.Length - 1]}");
        #endif
        
        // Main processing logic
        int sum = 0;
        foreach (int item in data) {
            sum += item;
        }
        
        Console.WriteLine($"Sum: {sum}");
        
        #if DEBUG
            Console.WriteLine("Processing completed successfully");
        #endif
    }
}

class Program {
    static void Main(string[] args) {
        DataProcessor processor = new DataProcessor();
        int[] numbers = { 10, 20, 30, 40, 50 };
        processor.ProcessData(numbers);
    }
}

The output in Debug mode includes additional diagnostic information −

Processing 5 items
First item: 10, Last item: 50
Sum: 150
Processing completed successfully

Multiple Conditional Directives

Example

using System;

class Program {
    static void Main(string[] args) {
        #if DEBUG
            Console.WriteLine("Debug build - detailed logging enabled");
            ShowDiagnostics();
        #elif RELEASE
            Console.WriteLine("Release build - optimized performance");
        #else
            Console.WriteLine("Unknown build configuration");
        #endif
        
        Console.WriteLine("Main application logic runs here");
    }
    
    #if DEBUG
    static void ShowDiagnostics() {
        Console.WriteLine($"Current time: {DateTime.Now}");
        Console.WriteLine($"Memory usage information would go here");
    }
    #endif
}

The output in Debug mode −

Debug build - detailed logging enabled
Current time: 12/8/2024 10:30:45 AM
Memory usage information would go here
Main application logic runs here

Comparison of Debug vs Release

Feature Debug Mode Release Mode
DEBUG symbol Defined Not defined
Code optimization Minimal Full optimization
Debug information Included (.pdb files) Optional/excluded
Performance Slower Faster
File size Larger Smaller

Conclusion

Conditional compilation directives like #if DEBUG provide a powerful way to include debugging code during development while keeping it out of production builds. This approach helps maintain clean, optimized release versions while providing rich diagnostic information during development and testing phases.

Updated on: 2026-03-17T07:04:36+05:30

2K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements