Bedingte Kompilierung oder Kleines Präprozessor ABC für C#
Einleitung
Der Präprozessor unter C# ist nicht zu vergleichen mit den wesentlich komplexeren Präprozessoren der C und C++ Compiler.
Es gibt z.B. weder eine Makroverarbeitung noch die Möglichkeit mit #include sogenannte Header Dateien zu inkludieren. Da dieser Beitrag „Kleines Präprozessor ABC“ heißt, möchte ich darauf verzichten auf die Einzelheiten solcher Unterschiede einzugehen.
Verfügbare Direktiven des C# Präprozessor
Direktive | Typ | Verwendung |
#define | Bezeichner | Mit #define wird ein Bezeichner gesetzt. Stellen Sie sich einen Bezeichner wie eine boolsche Variable vor. #define ist dann so wie das setzen einer Variablen auf true. Einem Bezeichner können keine Werte zugewiesen werden |
#undef | Bezeichner | Mit #undef heben Sie die Gültigkeit eines Bezeichners auf. Sie können dies auch mit dem setzen einer Variablen auf false setzen vergleichen. |
#if | Ausdruck | Der Code innerhalb des mit #if eingeleiteten Abschnittes wird ausgeführt wenn der Ausdruck wahr ist (Bei einfachen #if Ausdrücken ist das der Fall wenn der auf #if folgende Bezeichner gesetzt ist. |
#else | Ergibt der diesem #else vorangegangene Ausdruck false, dann wird der Bereich des #else ausgeführt. | |
#elif | Ausdruck | Anstelle des #else kann man mit Hilfe des #elif Ausdrucks diesen Bereich nur dann ausführen lassen, wenn der Angegebene Ausdruck true ergibt |
#endif | Zeigt das Ende eines Ausdrucks bzw. einer zusammengehörenden Reihe von Ausdrücken an. | |
#warning | Ausdruck | Ausgabe einer Warnung während des Kompilieren’s |
#error | Ausdruck | Ausgabe einer Fehlermeldung während des Kompilieren’s |
#line | Ausdruck | Ermöglicht die Manipulation und Ausgabe von Zeilennummern, nähere Informationen hierüber kann man hier nachlesen |
#region | Direktive | Bezeichnet den Anfang einer Region im Quelltext. Beispiel #region Events |
#endregion | Ende einer mir #region eingeleiteten Region im Quelltext | |
#pragma | Direktive | Mit #pragma gibt man spezielle Anweisungen für das Verhalten des Compilers. Beispiel: #pragma warning disable 123, 4567 zum Abschalten bestimmter Compiler Warnungen. Nähere Informationen über die #pragma Direktiven gibt es hier |
Operatoren für die Verwendung mit Ausdrücken
Operatoren | Beispiel | Funktionsweise |
! | #if !DEBUG | Das ! negiert den Wert von var. Im Beispiel bedeutet das, ist DEBUG nicht definiert, wird der #if Bereich ausgeführt. |
== | #if DEBUG == true | == Prüft auf Gleichheit. Im Beispiel bedeutet dies, wenn DEBUG definiert ist, dann wird der Bereich des #if Ausdrucks ausgeführt. |
!== | #if DEBUG !== true | == Prüft auf Ungleichheit. Im Beispiel bedeutet dies, wenn DEBUG definiert ist, dann wird der Bereich des #if nicht Ausdrucks ausgeführt. |
&& | #if DEBUG && TRACE | Logisches Und. Wenn DEBUG und TRACE definiert sind, wird der #if Ausdruck wahr, also ausgeführt. |
|| | #if DEBUG || TRACE | Logisches Oder (kein Exklusiv Oder). Der #if Ausdruck ist wahr wenn DEBUG und/oder TRACE definiert sind. |
Beispiele
Einfaches Beispiel mit einem Define und einer Bedingten Kompilierung
#define DEBUG
#if DEBUG
// Diese Bereich wird nur kompiliert wenn DEBUG definiert ist
System.Diagnostics.Debug.WriteLine(„DEBUG ist definiert“);
#endif
Beispiel einer Anwendung mit einem error Ausdruck und einem #elif
#define RELEASE
#define DEMO
#if RELASE && DEMO
#error RELEASE und DEMO dürfen nicht zusammen verwendet werden
#elif DEMO
// HIER zum Beispiel der Code, der eine DEMO Version beschränkt, oder was auch immer
#endif
Gibt es dazu auch ein äquivalent für XAML? Es wäre ganz interessant für eine Demoversion auch das UI beschränken zu können.