Laden...

#if #endif, was macht das ?

Erstellt von Glowhollow vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.670 Views
G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren
#if #endif, was macht das ?

Hallo,

ich muß mich n bischen in fremden Code einlesen, und bin über folgendes gestoßen....


public DateParseHandling DateParseHandling
{
 get => _dateParseHandling;
set
 {
 if (value < DateParseHandling.None ||
#if HAVE_DATE_TIME_OFFSET
value > DateParseHandling.DateTimeOffset
#else
value > DateParseHandling.DateTime
#endif
)
{
 throw new ArgumentOutOfRangeException(nameof(value));
 }
 _dateParseHandling = value;
 }
}

was für ne Bedeutung hat das #if - ist das sowas eine Kompileranweisung ?

Edit: ok, hätte auch google verwenden können. Gut es ist eine Anweisung für ein Symbol. Leider verstehe ich das mit dem Symbol nicht so ganz.

Nachtrag: Verstehe, man definiert ein Symbol um, bestimmte bzw. unterschiedliche "Mechaniken" beim Kompilen auszulösen.

Frage. Was bringt mir das effektiv ? Klar kann ich sowas wie - ich starte mal im Debug modus - ausführen und mir dann z.bsp. die ganzen Debug Meldungen anzeigen lassen. Aber das sind doch dinge, die doch nicht zur laufzeit passieren ? Oder doch ? Also, ich kann doch nicht den Code in 2 Variante z.bsp. ausführen lassen (entweder debug oder release). Oder kann man dieses "Flag" setzen...

Kann mich hier jemand etwas erleuchten ?

L
95 Beiträge seit 2009
vor 5 Jahren

In C nennt man sowas eine Präprozessor Anweisung. In C# gibt es diese auch:
https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/preprocessor-directives/

Braucht man dort nur eher selten bis gar nicht.
Man kann diese Anweisungen verwenden um zur Compilezeit einen bestimmten Codepfad auszuwählen oder z.B. mit #region eine einklappbare Region des Codes zu definieren.

In C/C++ hat der Präprozessor wesentlich mehr Verwendung und kann auch mehr als in C#.

Zu deiner eigentlich Frage:

Selbstverständlich kannst du das Symbol definieren:


#define HAVE_DATE_TIME_OFFSET

Steht aber auch alles in den Link oben drin.

W
113 Beiträge seit 2006
vor 5 Jahren

Hallo,

die Symbole definiert man zum Compile-Zeitpunkt. Somit kann man mit den Symbolen steuern, welche Teile kompiliert werden sollen.

Anwendungsbeispiele:*Code der z.B. nur in Release oder Debug Builds enthalten sein soll *Falls man für verschiedene .NET Versionen baut, kann es sein dass gewisse Teile des Codes anders sein müssen

Gruß

Edit: typos

4.931 Beiträge seit 2008
vor 5 Jahren

Die Symbole werden aber meist dann über die Projekteinstellungen ("Symbole für bedingte Kompilierung") gesetzt, so daß man die selbe Datei (ohne Änderung) für verschiedene Projektkonfigurationen benutzen kann.

16.806 Beiträge seit 2008
vor 5 Jahren

Eigentlich braucht man diese Dinge kaum noch - wenn überhaupt.
Ich kann mich nicht dran erinnern, wann ich das das letzte Mal gebraucht hab.

Für funktionale Dinge wie Dein Code Sample würde man das heute nicht mehr mit Compiler Befehlen manipulieren, sondern mit Feature Flags zur Laufzeit.

3.003 Beiträge seit 2006
vor 5 Jahren

Nützlich, wenn die Bibliothek für mehrere Ziele (Framework-Versionen) kompiliert wird.


#if NET_MIN_3
public static Example ExtensionMethod(this ExampleSource source)
#else
public static Example ExtensionMethod(ExampleSource source)
#endif
{
    return new Example(source.Id);
}

Blödes Beispiel, weil .NET 3 wirklich LANGE her ist, aber das Prinzip wird klar. Compilerweichen, zu häufig eingesetzt, vermüllen den Code ziemlich und können auch beim Debugging stören. Es gibt schönere Alternativen, sind ja auch schon erwähnt worden.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

1.040 Beiträge seit 2007
vor 5 Jahren

Als Nachtrag zu LaTinos Beitrag: in einer externen Bibliothek sah ich so ein #if-Konstrukt mal mit SILVERLIGHT... gefühlt jede zweite Zeile. X(