C# Language Reference
#if (C# Reference)

When the C# compiler encounters an #if directive, followed eventually by an #endif directive, it will compile 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. For example,

#define DEBUG
// ...
#if DEBUG
    Console.WriteLine("Debug version");
#endif

You can use the operators == (equality), != (inequality) only to test for true or false . True means the symbol is defined. The statement #if DEBUG has the same meaning as #if (DEBUG == true). The operators && (and), and || (or) can be used to evaluate whether multiple symbols have been defined. You can also group symbols and operators with parentheses.

Remarks

#if, along with the #else, #elif, #endif, #define, and #undef directives, lets you include or exclude code based on the existence of one or more symbols. This can be useful when compiling code for a debug build or when compiling for a specific configuration.

A conditional directive beginning with a #if directive must explicitly be terminated with a #endif directive.

#define lets you define a symbol, such that, by using the symbol as the expression passed to the #if directive, the expression will evaluate to true.

You can also define a symbol with the /define compiler option. You can undefine a symbol with #undef.

A symbol that you define with /define or with #define does not conflict with a variable of the same name. That is, a variable name should not be passed to a preprocessor directive and a symbol can only be evaluated by a preprocessor directive.

The scope of a symbol created with #define is the file in which it was defined.

Example

// preprocessor_if.cs
#define DEBUG
#define MYTEST
using System;
public class MyClass 
{
    static void Main() 
    {
#if (DEBUG && !MYTEST)
        Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && MYTEST)
        Console.WriteLine("MYTEST is defined");
#elif (DEBUG && MYTEST)
        Console.WriteLine("DEBUG and MYTEST are defined");
#else
        Console.WriteLine("DEBUG and MYTEST are not defined");
#endif
    }
}
DEBUG and MYTEST are defined
See Also

Concepts

Reference

Other Resources

Tags :


Community Content

dalbhidenitin
The remarks section does not contain information about the ! operator

The description of ! operator should also be mentioned in the description inside remarks.

The example demonstrates this capabilty though -

#if (DEBUG && !VC_V7)
Console.WriteLine("DEBUG is defined");

Tags :

kkammler
No example for ==, !=, ||, &&

Between the first code example, and the Remarks section, the text indicates that the ==, !=, ||, and && operators can be used. Now while the || and && operators are obvious to anyone who has used Turbo Pascal / Delphi, the == and != operators don't have an example of use, and don't operate as #ifs do in C/C++.

Could someone please demonstrate how the == and != operators are supposed to function?

Tags :

Mr. Davies
Simple example showing how to bypass code while in debug mode

#if !DEBUG

//Any code here will not be executed when running in debug mode

#endif

You will see that the code will be grey when in debug mode. When you change to release mode the code will have the same color as the rest of the code that will be executed

In english: If debug mode happens to not be true then proceed.

Usuall you would have less code during debug then in release:

#if DEBUG

//OUTPUT SOME DEBUGGING INFO THAT WE DON'T NEED WHEN PUBLISHING A RELEASE

#endif

Tags :

Page view tracker