/// <summary> /// Schreibt den Text auf den Bildschirm. /// </summary> /// <param name="text">Der Hinweis, der ausgegeben werden soll.</param> /// <param name="modus">Steuert die Art der Ausgabe</param> protected static void Ausgeben(string text, AusgabeModus modus) { switch (modus) { case AusgabeModus.Debug: Entwicklungsbasis.Ausgeben(text, debug: true); break; case AusgabeModus.Fehler: System.Console.ForegroundColor = ConsoleColor.Yellow; System.Console.WriteLine(text); System.Console.ResetColor(); break; case AusgabeModus.Normal: Entwicklungsbasis.Ausgeben(text, debug: false); break; case AusgabeModus.NormalOhneVorschub: System.Console.Write(text); break; #if DEBUG default: //Hier wird diese Ausgeben-Überladung // R E K U R S I V (selber) aufgerufen Entwicklungsbasis.Ausgeben( $"FEHLER: AusgabeModus {modus} nicht vorgesehen!", AusgabeModus.Fehler); //Falls rekursive Aufrufe irrtümlich passieren, //stürzt die Anwendung mit "Stapelüberlauf (Stack Overflow)" ab. break; #endif } }
/// <summary> /// Initialisiert ein neues Objekt. /// </summary> /// <remarks>Hier handelt es sich um den Konstruktor. /// Mit dem Konstruktor beginnt das Objekt zu leben. /// Wird mit dem "new" Schlüsselwort aufgerufen.</remarks> public Entwicklungsbasis() { //Neu seit C# 7 (2016): Einsetzen von Daten in einen Text ($) Entwicklungsbasis.Ausgeben($"Ein Objekt \"{this.GetType().Name}\" lebt...", debug: true); // ^-> eine Escape-Sequenz, damit // das Anführungszeichen ausgegeben wird // ^-> "this" ist das Schlüsselwort, um auf das // aktuelle Objekt zuzugreifen. // Benötigt man mehr Information zum aktuellen // Objekt, die .Net Reflection benutzen. // Zugriff auf die Reflection ist die von // System.Object geerbte GetType-Methode // ^-> {Variable} Ausdrucksform ist erst // seit 2016 möglich // ^-> Dollar $ wird für {Variable}, die implizite Textersetzung, // benutzt. Wird vom Trainer nicht benutzt. Max. bei // Protokolleinträgen, weil die TExte ja aus "lokalisierten" Ressourcedateien // Aber: Die Microsoft Beispiele nutzen mittlerweile alle diese // Variante (weils in den Beispielen um nix geht) }
/// <summary> /// Schreibt den Text für den Benutzer /// normal auf den Bildschirm. /// </summary> /// <param name="text">Der Hinweis, der angezeigt werden soll.</param> /// <remarks>Hier handelt es sich um eine überladene Methode.</remarks> protected static void Ausgeben(System.String text) // ^-> "Parameter" // |-----------| (Daten)Typ der Information im Paramter // Keine .Net Sprache hat eigene Datentypen // Alle Typen gehören .Net, z. B. System.String // für einen Text // |------------------| // Schnittstelle // damit eine Methode, weiß womit gearbeitet werden muss // ^-> "void" für eine Methode, die arbeitet aber nichts zurückgibt // ^-> wäre "Sub" in BASIC // ^-> "static" sagt, dass die Methode nicht dem // Objekt gehört sondern der Klasse // (Damit diese Ausgeben-Methode auch z. B. im Main() genutzt werden kann) //-> "protected" ist ein Mittelding zwischen // "public" (überall sichtbar) und "private" (nur in dieser Klasse sichtbar) { //this.Aus... // ^-> gibt's nicht // ^-> "this" ist der Zeige auf das aktuelle Objekt // Ausgeben ist statisch, deshalb nur über die Klasse aufrufbar //Entwicklungsbasis.Ausgeben(text, false); // ^-> warum hier "false". Damit's // lesbarer wird... //=> Benannte Parameter benutzen!!! Entwicklungsbasis.Ausgeben(text, debug: false); // |----| "benannter" Parameter //Bei benannten Parametern muss die Reihenfolge beim Beschicken //nicht eingehalten werden. Aber ab dem ersten benannten Parameter, //müssen die folgenden Parameternamen auch getippt werden. //Entwicklungsbasis.Ausgeben(debug: false, text: text); //HAUPTGRUNDSATZ DER KONVENTIONEN: //=> Die Lesbarkeit ist der Kürze vorzuziehen! }