C# Präprozessordirektiven

Präprozessordirektiven weisen den Compiler an, Informationen vor der eigentlichen Kompilierung vorzuverarbeiten.

Mit diesen Direktiven können Sie steuern, wie der Compiler Dateien kompiliert oder welche Teile kompiliert werden. Häufige Präprozessordirektiven umfassen bedingte Kompilierung, Makrodefinitionen und so weiter.

Alle Präprozessordirektiven beginnen mit#Sie beginnen mit #, und in einer Zeile dürfen vor einer Präprozessordirektive nur Whitespace-Zeichen stehen.

Präprozessordirektiven sind keine Anweisungen, daher enden sie nicht mit einem Semikolon.;Ende.

Der C#-Compiler besitzt keinen separaten Präprozessor; die Direktiven werden jedoch so behandelt, als gäbe es einen. In C# werden Präprozessordirektiven für die bedingte Kompilierung verwendet. Anders als in C und C++ werden sie nicht zum Erstellen von Makros verwendet. Eine Präprozessordirektive muss die einzige Direktive in dieser Zeile sein.

Liste der C#-Präprozessordirektiven

Die folgende Tabelle listet die in C# verfügbaren Präprozessordirektiven auf:

DirektiveBeschreibung
#defineDefiniere ein Symbol, das für die bedingte Kompilierung verwendet werden kann.
#undefHebt die Definition eines Symbols auf.
#ifBeginne einen Block für die bedingte Kompilierung; schließe den Codeblock ein, wenn das Symbol definiert ist.
#elifWenn die vorherige#ifoder#elifWenn die vorherige Bedingung nicht erfüllt ist und die aktuelle Bedingung erfüllt ist, schließe den Codeblock ein.
#elseWenn die vorherige#ifoder#elifWenn die Bedingung nicht erfüllt ist, schließe den Codeblock ein.
#endifBeende einen Block für die bedingte Kompilierung.
#warningGeneriere eine Compilerwarnung.
#errorGeneriere eine Compilerfehlermeldung.
#regionMarkiere einen Codebereich, der in der IDE ein- und ausgeklappt werden kann, wodurch die Codeorganisation und das Lesen erleichtert werden.
#endregionBeende einen Codebereich.
#lineÄndere die Zeilennummer und den Dateinamen in der Compilerausgabe, was zum Debuggen oder für von Tools generierten Code verwendet werden kann.
#pragmaWird verwendet, um spezielle Anweisungen an den Compiler zu senden, z. B. zum Deaktivieren oder Wiederherstellen bestimmter Warnungen.
#nullableSteuern den Nullable-Kontext und Annotationen, sodass Compilerprüfungen für Nullable-Verweistypen aktiviert oder deaktiviert werden können.

Beispiel

#define DEBUG

#if DEBUG
    Console.WriteLine("Debugmodus");
#elif RELEASE
    Console.WriteLine("Release-Modus");
#else
    Console.WriteLine("Anderer Modus");
#endif

#warning Dies ist eine Warnmeldung
#error Dies ist eine Fehlermeldung

#region MyRegion
    // Ihr Code hier
#endregion

#line 100 "MyFile.cs"
    // Die nächste Zeile wird in MyFile.cs als Zeile 100 gemeldet
    Console.WriteLine("This is line 100");
#line default
    // Die Zeilennummerierung wird wieder normal

#pragma warning disable 414
    private int unusedVariable;
#pragma warning restore 414

#nullable enable
    string? nullableString = null;
#nullable disable

#define und #undef Präprozessor

#defineWird verwendet, um ein Symbol zu definieren (normalerweise für bedingte Kompilierung),#undefWird verwendet, um die Definition eines Symbols aufzuheben.

#define DEBUG

#undef RELEASE

#define ermöglicht es Ihnen, ein Symbol zu definieren, sodass der Ausdruck true zurückgibt, wenn das Symbol als Ausdruck an die #if-Direktive übergeben wird. Die Syntax lautet wie folgt:

#define symbol

Das folgende Programm veranschaulicht dies:

Beispiel

#define PI
using System;
namespace PreprocessorDAppl
{
   class Program
   {
      static void Main(string[] args)
      {
         #if (PI)
            Console.WriteLine("PI ist definiert");
         #else
            Console.WriteLine("PI ist nicht definiert");
         #endif
         Console.ReadKey();
      }
   }
}

Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:

PI is defined

Bedingte Direktiven: #if, #elif, #else und #endif

Sie können die#if-Direktive verwenden, um eine bedingte Direktive zu erstellen.

Bedingte Direktiven werden verwendet, um zu testen, ob ein Symbol true ist. Wenn true, führt der Compiler den#if-Code zwischen dieser Direktive und der nächsten aus.

Syntax der bedingten Direktiven:

#if symbol [operator symbol]...

wobei,Symbolder Name des Symbols, das getestet werden soll. Sie können auch true und false verwenden oder einen Negationsoperator vor das Symbol setzen.

Zu den üblichen Operatoren gehören:

  • == (gleich)
  • != (ungleich)
  • && (UND)
  • || (ODER)

Sie können auch Klammern verwenden, um Symbole und Operatoren zu gruppieren. Bedingte Direktiven werden verwendet, um Code in Debug-Builds oder beim Kompilieren einer angegebenen Konfiguration zu kompilieren. Eine bedingte Direktive, die mit einer#if-Direktive beginnt, muss ausdrücklich mit einer#endifAnweisung beendet.

#define DEBUG

#if DEBUG
    Console.WriteLine("Debug mode");
#elif RELEASE
    Console.WriteLine("Release mode");
#else
    Console.WriteLine("Other mode");
#endif

Das folgende Programm veranschaulicht die Verwendung bedingter Direktiven:

Beispiel

#define DEBUG
#define VC_V10
using System;
public class TestClass
{
   public static void Main()
   {

      #if (DEBUG && !VC_V10)
         Console.WriteLine("DEBUG ist definiert");
      #elif (!DEBUG && VC_V10)
         Console.WriteLine("VC_V10 ist definiert");
      #elif (DEBUG && VC_V10)
         Console.WriteLine("DEBUG und VC_V10 sind definiert");
      #else
         Console.WriteLine("DEBUG und VC_V10 sind nicht definiert");
      #endif
      Console.ReadKey();
   }
}

Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:

DEBUG and VC_V10 are defined

#warning und #error

#warning wird verwendet, um Compilerwarnungen zu erzeugen, und #error wird verwendet, um Compilerfehler zu erzeugen.

#warning This is a warning message
#error This is an error message

#region und #endregion

Wird für Code-Folding verwendet, um den Code lesbarer zu machen.

#region MyRegion
    // Your code here
#endregion

#line

Wird verwendet, um die Dateizeilennummer und den Dateinamen in der Compilerausgabe zu ändern.

#line 100 "MyFile.cs"
    // The next line will be reported as line 100 in MyFile.cs
    Console.WriteLine("This is line 100");
#line default
    // Line numbering returns to normal

#pragma

Wird verwendet, um dem Compiler spezielle Anweisungen zu übermitteln. Der häufigste Einsatz ist das Deaktivieren bestimmter Warnungen.

#pragma warning disable 414
    private int unusedVariable;
#pragma warning restore 414

Hinweise zur Verwendung von Präprozessordirektiven

  • Verbessern Sie die Lesbarkeit des Codes: Verwenden Sie#regionKann helfen, Codeblöcke zu trennen und die Codeorganisation zu verbessern.
  • Bedingte Kompilierung: durch#ifSolche Direktiven können in Entwicklungs- und Produktionsumgebungen unterschiedlichen Code kompilieren, was das Debugging und Release erleichtert.
  • Warnungen und Fehler: durch#warningund#errorSie können Entwickler dazu anregen, beim Kompilieren auf bestimmte Probleme zu achten.

Durch die korrekte Verwendung dieser Präprozessordirektiven können Sie den Kompilierungsprozess von Code besser steuern und die Flexibilität und Wartbarkeit des Codes verbessern.

Weitere Erweiterungen