Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
#if #endif, was macht das ?
Glowhollow
myCSharp.de - Member



Dabei seit:
Beiträge: 74

Themenstarter:

#if #endif, was macht das ?

beantworten | zitieren | melden

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 ?
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Glowhollow am .
private Nachricht | Beiträge des Benutzers
Lenny
myCSharp.de - Member



Dabei seit:
Beiträge: 95

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
WarLorD_XaN
myCSharp.de - Member



Dabei seit:
Beiträge: 111
Herkunft: Austria

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von WarLorD_XaN am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.433

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.034

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1.040

beantworten | zitieren | melden

Als Nachtrag zu LaTinos Beitrag: in einer externen Bibliothek sah ich so ein #if-Konstrukt mal mit SILVERLIGHT... gefühlt jede zweite Zeile. X(
private Nachricht | Beiträge des Benutzers