# 2 Grundlagen der Sprache C# Nach der Einführung im ersten Kapitel wenden wir uns nun der Programmierung zu, die sich – losgelöst von allen Einflüssen, die die Common Language Runtime (CLR) ausübt – grundsätzlich in zwei Kategorien einteilen lässt: fundamentale Sprachsyntax Objektorientierung Ein tiefgehendes Verständnis beider Ansätze ist Voraussetzung, um eine auf .NET basierende Anwendung entwickeln zu können. Wenn Sie keine Programmierkenntnisse haben, auf die aufgebaut werden kann, ist das gleichzeitige Erlernen beider Teilbereiche schwierig und hindernisreich – ganz abgesehen von den Problemen, die der Umgang mit der komplexen Entwicklungsumgebung aufwirft. Wir werden uns daher in diesem Kapitel zunächst der Syntax von C# zuwenden, ohne die Objektorientierung zu berücksichtigen – zumindest weitestgehend, denn ohne den einen oder anderen flüchtigen Blick in die .NET-Klassenbibliothek werden wir nicht auskommen. ## 2.1 Konsolenanwendungen ### 2.1.1 Allgemeine Anmerkungen Um den Einstieg möglichst einfach zu halten, insbesondere für diejenigen Leser, die sich zum ersten Mal mit der Programmierung beschäftigen, drehen wir das Rad der EDV-Geschichte zurück und werden unsere Programmbeispiele zunächst nur als Konsolenanwendungen entwickeln. Konsolenanwendungen werden im DOS-Fenster ausgeführt, das häufig auch als Eingabeaufforderung bezeichnet wird. Sie sind einerseits überschaubarer als Anwendungen mit visualisierter Benutzeroberfläche, andererseits kann man sich mit der Entwicklungsumgebung schrittweise vertraut machen, ohne durch die vielen Dialogfenster und den automatisch generierten Code sofort den Überblick zu verlieren. Das Ziel dieses Kapitels ist es, Ihnen die fundamentale Sprachsyntax von C# näherzubringen. Erst danach soll der objektorientierte Ansatz in den Kapiteln 3 bis 5 eingehend erläutert werden. ### 2.1.2 Ein erstes Konsolenprogramm Nach dem erstmaligen Öffnen eines Projekts vom Typ Konsolenanwendung wird im Codeeditor eine Codestruktur angezeigt, die der gewählten Vorlage entspricht. Sie sieht wie folgt aus:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace ConsoleApplication1
    {
      class Program
      {
        static void Main(string[] args)
        {
        }
      }
    }
Dieser Coderumpf besitzt noch keinerlei Funktionalität, die wir zur Laufzeit des Programms beobachten könnten. Er gibt uns nur den minimalen Rahmen vor, in den wir unseren Code hineinschreiben müssen. Eine Konsolenanwendung öffnet ein Kommandofenster und schreibt Informationen in dieses. Das wollen wir nun in unserer ersten kleinen Anwendung realisieren und uns die Zeichenfolge »C# macht Spaß.« ausgeben lassen. Dazu ergänzen Sie den Programmcode folgendermaßen:
    ...
    static void Main(string[] args)
    {
      Console.WriteLine("C# macht Spaß.");
      Console.ReadLine();
    }
    ...
Wir haben zwei Zeilen Programmcode eingefügt. Die erste dient dazu, eine Ausgabe in die Konsole zu schreiben. Mit der genauen Syntax dieser Anweisung werden wir uns später noch auseinandersetzen. Würden wir auf die zweite Anweisung verzichten, träte ein hässliches Phänomen auf: Das Konsolenfenster würde sich zwar öffnen, aber auch sofort wieder schließen. Wir könnten kaum die Ausgabe der Zeichenfolge lesen. Mit
    Console.ReadLine();
stellen wir sicher, dass die Konsole so lange geöffnet bleibt, bis der Anwender sie mit der -Taste schließt. Nahezu gleichwertig können Sie auch
    Console.ReadKey();
schreiben. Der Unterschied ist der, dass ReadKey auf jede Taste reagiert. Nun wollen wir uns vom Erfolg unserer Aktion natürlich auch überzeugen und das Laufzeitverhalten testen. Dazu gibt es mehrere Möglichkeiten: Sie klicken in der Symbolleiste auf die Schaltfläche Starten. Sie wählen im Menü Debuggen das Element Debuggen starten. Sie drücken die -Taste auf der Tastatur.
Hinweis
Sie können das Projekt aus der Entwicklungsumgebung auch starten, wenn Sie im Menü Debuggen das Untermenü Starten ohne Debuggen wählen. Das hat den Vorteil, dass Sie auf die Anweisung
    Console.ReadLine();
verzichten können. Dafür wird an der Konsole automatisch die Aufforderung Drücken Sie eine beliebige Taste ... angezeigt.
Wenn jetzt die Ausführung gestartet wird, sollte das Konsolenfenster geöffnet werden und wunschgemäß die Zeichenfolge
    C# macht Spaß.
anzeigen. Geschlossen wird die Konsole durch Drücken der -Taste. Daraufhin wird die Laufzeit beendet, und wir gelangen wieder in die Entwicklungsumgebung zurück. Nehmen wir an, Sie hätten einen kleinen Fehler gemacht und vergessen, hinter der Anweisung
    Console.ReadLine()
ein Semikolon anzugeben. Wie Sie gleich genauer erfahren werden, muss jede C#-Anweisung mit einem Semikolon abgeschlossen werden. Nun würde ein syntaktischer Fehler vorliegen, den unser C#-Compiler natürlich nicht akzeptieren kann. Sie bekommen eine Meldung zu dem aufgetretenen Fehler in einem separaten Fenster angezeigt, in der sogenannten Fehlerliste (siehe Abbildung 2.1). Hier klicken, um das Bild zu vergrößern Abbildung 2.1 Die Liste mit den Fehlermeldungen In unserem Beispiel ist nur ein Fehler aufgetreten. Wären es mehrere, würden diese der Reihe nach untereinander erscheinen. Die Beschreibung des Fehlers ist in den meisten Fällen recht informativ – zumindest dann, wenn man etwas Erfahrung im Umgang mit .NET hat. Da sich .NET-Anwendungen in der Regel aus mehreren Dateien zusammensetzen, wird zudem die betroffene Datei genannt und die Zeile, in der der Fehler aufgetreten ist. Sollten Sie im Codefenster keine Zeilennummern sehen, können Sie die Anzeige über das Menü Extras • Optionen einstellen. Markieren Sie dazu, wie in Abbildung 2.2 gezeigt, in der Liste den Eintrag Text-Editor • Alle Sprachen, und setzen Sie das Häkchen vor Zeilennummern. Hier klicken, um das Bild zu vergrößern Abbildung 2.2 So setzen Sie die Option zum Anzeigen der Zeilennummern im Codeeditor.