#if (C#-Referenz)#if (C# Reference)

Wenn der C#-Compiler eine #if-Anweisung vorfindet, auf die möglicherweise eine #endif-Anweisung folgt, wird der Code zwischen den Anweisungen nur dann kompiliert, wenn das angegebene Symbol definiert wurde.When the C# compiler encounters an #if directive, followed eventually by an #endif directive, it compiles the code between the directives only if the specified symbol is defined. Im Gegensatz zu C und C++ können Sie einem Symbol keinen numerischen Wert zuweisen.Unlike C and C++, you cannot assign a numeric value to a symbol. Die #if-Anweisung in C# ist ein boolescher Wert und überprüft nur, ob das Symbol definiert wurde.The #if statement in C# is Boolean and only tests whether the symbol has been defined or not. Zum Beispiel:For example:

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

Sie können die Operatoren == (Gleichheit) und != (Ungleichheit) nur zur Überprüfung auf true oder false verwenden.You can use the operators == (equality) and != (inequality) only to test for true or false. „True“ bedeutet, dass das Symbol definiert wurde.True means the symbol is defined. Die #if DEBUG-Anweisung hat die gleiche Bedeutung wie #if (DEBUG == true).The statement #if DEBUG has the same meaning as #if (DEBUG == true). Sie können mithilfe der Operatoren && (und), || (oder) und !You can use the operators && (and), || (or), and ! (nicht ) auswerten, ob mehrere Symbole definiert wurden.(not) to evaluate whether multiple symbols have been defined. Symbole und Operatoren können auch mit Klammern gruppiert werden.You can also group symbols and operators with parentheses.

HinweiseRemarks

Wenn Sie #if mit den Anweisungen #else, #elif, #endif, #define und #undef verwenden, können Sie Code je nach dem Vorhandensein eines oder mehrerer Symbole ein- oder ausschließen.#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. Dies kann hilfreich sein, wenn Code für einen Debugbuild oder für eine bestimmte Konfiguration kompiliert wird.This can be useful when compiling code for a debug build or when compiling for a specific configuration.

Eine bedingte Anweisung, die mit einer #if-Anweisung beginnt, muss explizit mit einer #endif-Anweisung beendet werden.A conditional directive beginning with a #if directive must explicitly be terminated with a #endif directive.

Über #define können Sie ein Symbol definieren.#define lets you define a symbol. Wenn dieses Symbol dann als Ausdruck an die #if-Anweisung übergeben wird, wird der Ausdruck als true ausgewertet.By then using the symbol as the expression passed to the #if directive, the expression evaluates to true.

Ein Symbol kann auch mit der /define-Compileroption definiert werden.You can also define a symbol with the /define compiler option. Die Definition eines Symbols kann mit #undef aufgehoben werden.You can undefine a symbol with #undef.

Zwischen einem Symbol, das mit /define oder mit #define definiert wird, und einer Variablen mit dem gleichen Namen kommt es zu keinem Konflikt.A symbol that you define with /define or with #define doesn't conflict with a variable of the same name. Das bedeutet, dass ein Variablenname nicht an eine Präprozessoranweisung übergeben werden sollte und ein Symbol nur von einer Präprozessoranweisung ausgewertet werden kann.That is, a variable name should not be passed to a preprocessor directive, and a symbol can only be evaluated by a preprocessor directive.

Der Gültigkeitsbereich eines mit #define erstellten Symbols ist die Datei, in der es definiert wurde.The scope of a symbol created with #define is the file in which it was defined.

Das Buildsystem kennt zudem vordefinierte Präprozessorsymbole, die verschiedene Zielframeworks darstellen.The build system is also aware of predefined preprocessor symbols representing different target frameworks. Diese sind hilfreich, wenn Sie Anwendungen erstellen, die für mehrere .NET-Implementierungen oder -Versionen bestimmt sind.They're useful when creating applications that can target more than one .NET implementation or version.

Zielframeworks Symbole
.NET Framework NET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET47, NET471
.NET-Standard NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0
.NET Core NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0

Weitere vordefinierte Symbole sind die Konstanten DEBUG und TRACE.Other predefined symbols include the DEBUG and TRACE constants. Sie können die für das Projekt festgelegten Werte mit #define überschreiben.You can override the values set for the project using #define. Das DEBUG-Symbol beispielsweise wird abhängig von den Buildkonfigurationseigenschaften (Modus „Debug“ oder „Release“) automatisch festgelegt.The DEBUG symbol, for example, is automatically set depending on your build configuration properties ("Debug" or "Release" mode).

BeispieleExamples

Im folgenden Beispiel wird gezeigt, wie Sie ein MYTEST-Symbol für eine Datei definieren und dann die Werte der Symbole MYTEST und DEBUG testen.The following example shows you how to define a MYTEST symbol on a file and then test the values of the MYTEST and DEBUG symbols. Die Ausgabe dieses Beispiels hängt davon ab, ob Sie das Projekt im Debug- oder im Release-Konfigurationsmodus erstellen.The output of this example depends on whether you built the project on Debug or Release configuration mode.

#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
    }
}

Im folgenden Beispiel wird gezeigt, wie für andere Zielframeworks zu testen, damit Sie neuere APIs möglichst verwenden können:The following example shows you how to test for different target frameworks so you can use newer APIs when possible:

public class MyClass
{
    static void Main()
    {
#if NET40
        WebClient _client = new WebClient();
#else
        HttpClient _client = new HttpClient();
#endif
    }
    //...
}

Siehe auchSee also

C#-ReferenzC# Reference
C#-ProgrammierhandbuchC# Programming Guide
C#-PräprozessoranweisungenC# Preprocessor Directives
Gewusst wie: Bedingtes Kompilieren mit Ablaufverfolgung und DebuggenHow to: Compile Conditionally with Trace and Debug.