In dieser Lektion schreiben Sie Ihr erstes eigenes Programm, bringen es absichtlich zum Scheitern und reparieren es wieder. Danach wissen Sie, wie sich der Compiler meldet und wie Sie mit seinen Meldungen umgehen.

Hallo, Welt

Seit Jahrzehnten beginnt fast jeder Programmierkurs mit einem Programm, das „Hallo, Welt“ ausgibt. Es ist klein genug, dass fast nichts schiefgehen kann, und zeigt doch, dass die ganze Kette vom Text bis zur Ausgabe funktioniert.

Legen Sie in Ihrem Ordner csharp-k0 eine Datei hallo.cs an und schreiben Sie hinein:

C#
// hallo.cs
Console.WriteLine("Hallo, Welt!");

Speichern Sie und starten Sie das Programm im Terminal:

Bash
dotnet run hallo.cs
Hallo, Welt!

Es gibt auch eine Kurzform, dotnet hallo.cs. Sie tut dasselbe; in diesem Kurs schreiben wir immer die längere, weil sie deutlicher sagt, was passiert.

Was ist geschehen? dotnet hat Ihre Datei gelesen und an den Compiler gegeben. Der hat sie geprüft und übersetzt. Danach hat dotnet das übersetzte Programm gestartet. Es hat eine Zeile ausgegeben und sich beendet. Starten Sie das Programm ein zweites Mal: Es geht schneller, weil sich an der Datei nichts geändert hat und die Übersetzung schon vorliegt.

Was in der Zeile steht

Die Zeile Console.WriteLine("Hallo, Welt!"); besteht aus mehreren Teilen:

  • Console ist der Baustein für das Textfenster, in dem Ihr Programm läuft.
  • Der Punkt . heißt „davon“: Aus Console wollen Sie etwas benutzen.
  • WriteLine ist eine Methode, also etwas, das etwas tut. Diese hier schreibt eine Zeile.
  • In den runden Klammern ( ) steht, was die Methode bekommt, hier den Text, der ausgegeben werden soll.
  • Die Anführungszeichen " " begrenzen den Text. Ein Text im Programm heißt String (Zeichenkette).
  • Das Semikolon ; beendet die Anweisung, so wie ein Punkt einen Satz.

C# unterscheidet zwischen Groß- und Kleinschreibung. Console und console sind für den Compiler zwei verschiedene Wörter, und nur das erste kennt er.

Mehrere Zeilen

Ein Programm führt seine Anweisungen von oben nach unten aus, eine nach der anderen:

C#
// visitenkarte.cs
Console.WriteLine("Ada Beispiel");
Console.WriteLine("lernt gerade programmieren");
Console.WriteLine();
Console.WriteLine("Lieblingssprache: C#");
Ada Beispiel
lernt gerade programmieren

Lieblingssprache: C#

Console.WriteLine() ohne Text gibt eine leere Zeile aus. Neben WriteLine gibt es Write. Es schreibt den Text, beginnt danach aber keine neue Zeile:

C#
// eins-zwei-drei.cs
Console.Write("Eins, ");
Console.Write("zwei, ");
Console.WriteLine("drei.");
Console.WriteLine("Vier.");
Eins, zwei, drei.
Vier.

Soll ein Anführungszeichen selbst im Text stehen, schreiben Sie einen umgekehrten Schrägstrich davor: \". Sonst hielte der Compiler es für das Ende des Textes.

C#
// zitat.cs
Console.WriteLine("Sie sagte: \"Ich probiere es einfach aus.\"");
Sie sagte: "Ich probiere es einfach aus."

Kommentare

Alles hinter // bis zum Ende der Zeile ist ein Kommentar. Der Compiler überliest ihn. Kommentare sind für Menschen, auch für Sie selbst in drei Wochen. Ein guter Kommentar erklärt, warum etwas so ist. Was der Code tut, sollte der Code selbst gut lesbar zeigen.

C#
// kommentare.cs
// Die Begrüßung steht oben, weil sie als Erstes zu sehen sein soll.
Console.WriteLine("Guten Tag!");
Console.WriteLine("Schön, dass Sie da sind."); // Ein Kommentar kann auch hinter Code stehen.

Wenn der Compiler streikt

Jetzt bauen Sie absichtlich einen Fehler ein. Legen Sie fehler.cs an und lassen Sie das Semikolon weg:

C#
// fehler.cs
Console.WriteLine("Hallo, Welt!")
Bash
dotnet run fehler.cs

Statt der Begrüßung meldet sich der Compiler. Auf einem deutsch eingestellten Rechner sieht das ungefähr so aus (vor dem Dateinamen steht bei Ihnen der ganze Pfad zu Ihrem Ordner):

fehler.cs(2,34): error CS1002: ; erwartet.

Fehler beim Buildvorgang. Beheben Sie die Buildfehler, und versuchen Sie es anschließend noch mal.

Auf einem englisch eingestellten Rechner und in Codespaces steht dort error CS1002: ; expected und The build failed. So lesen Sie die Meldung:

  • fehler.cs ist die Datei,
  • (2,34) heißt Zeile 2, Zeichen 34. Dort hat der Compiler das Problem bemerkt, direkt hinter der schließenden Klammer.
  • error heißt: Das Programm kann so nicht übersetzt werden. Es startet gar nicht erst.
  • CS1002 ist die Nummer des Fehlers. Sie ist in jeder Sprache gleich. Wenn Sie eine Meldung nicht verstehen, suchen Sie im Netz nach der Nummer, zum Beispiel „CS1002“. Zu den meisten Nummern hat Microsoft eine eigene Seite mit Erklärung.
  • Dahinter steht in Worten, was fehlt.

Setzen Sie das Semikolon wieder ein, speichern Sie, und starten Sie erneut. Die Begrüßung erscheint wieder.

Neben Fehlern meldet der Compiler manchmal Warnungen (warning). Dann läuft das Programm trotzdem, aber der Compiler hat etwas entdeckt, das wahrscheinlich nicht so gemeint ist. Nehmen Sie Warnungen so ernst wie Fehler. In professionellen Projekten werden sie oft wie Fehler behandelt, und alle Beispiele in diesem Kurs laufen ohne eine einzige Warnung.

Woran der Rechner merkt, ob alles gut ging

Jedes Programm meldet beim Beenden eine Zahl zurück, den Exit-Code. 0 heißt „alles in Ordnung“, jede andere Zahl „etwas ist schiefgegangen“. Auf dem Bildschirm sehen Sie diese Zahl nicht, aber andere Programme lesen sie, zum Beispiel ein Werkzeug, das automatisch prüft, ob Ihr Code noch funktioniert. Sie können ihn sich direkt nach einem Programm anzeigen lassen.

In PowerShell unter Windows:

PowerShell
dotnet run hallo.cs
$LASTEXITCODE

Im Terminal von macOS, Linux und Codespaces:

Bash
dotnet run hallo.cs
echo $?

Nach hallo.cs steht dort 0. Nach fehler.cs mit fehlendem Semikolon steht dort 1, denn die Übersetzung ist gescheitert. Merken Sie sich diese Regel schon jetzt: Ob etwas geklappt hat, entscheidet der Exit-Code, nicht ein Text, der freundlich aussieht.

Übung 1

Schreiben Sie ein Programm meine-karte.cs, das eine kleine Visitenkarte mit Ihren eigenen Angaben ausgibt:

  • in der ersten Zeile Ihren Namen,
  • in der zweiten Zeile, was Sie beruflich machen oder machen möchten,
  • dann eine leere Zeile,
  • dann eine Zeile „Ich lerne C#, weil …“ mit Ihrem Grund. Bauen Sie diese letzte Zeile aus zwei Console.Write und einem Console.WriteLine zusammen.

Lösung 1

Ihr Text ist natürlich ein anderer. Entscheidend ist der Aufbau:

C#
// meine-karte.cs
Console.WriteLine("Ada Beispiel");
Console.WriteLine("Buchhalterin, bald vielleicht Entwicklerin");
Console.WriteLine();
Console.Write("Ich lerne C#, ");
Console.Write("weil ich wissen will, ");
Console.WriteLine("ob mir Programmieren liegt.");
Ada Beispiel
Buchhalterin, bald vielleicht Entwicklerin

Ich lerne C#, weil ich wissen will, ob mir Programmieren liegt.

Achten Sie auf die Leerzeichen am Ende der Texte in den Write-Zeilen. Ohne sie kleben die Wörter aneinander.

Übung 2

Dieses Programm hat vier Fehler. Speichern Sie es als reparieren.cs, starten Sie es und reparieren Sie es mithilfe der Meldungen. Der Compiler meldet mehrere Fehler auf einmal. Beheben Sie immer zuerst den obersten, dann starten Sie erneut: Spätere Meldungen sind oft nur Folgen des ersten Fehlers.

C#
// reparieren.cs
Console.WriteLine("Guten Morgen!);
console.WriteLine("Wie geht es Ihnen?");
Console.Writeline("Bis bald.")

Lösung 2

Die vier Fehler sind:

  1. In Zeile 2 fehlt das schließende Anführungszeichen. Der Compiler meldet CS1010 („Zeilenvorschub in Konstante“, englisch „Newline in constant“): Der Text läuft für ihn bis zum Zeilenende weiter.
  2. In Zeile 3 steht console klein. Der Compiler kennt den Namen nicht (CS0103).
  3. In Zeile 4 steht Writeline mit kleinem l. Console hat keine Methode mit diesem Namen (CS0117).
  4. In Zeile 4 fehlt das Semikolon (CS1002).

Repariert sieht das Programm so aus:

C#
// reparieren.cs
Console.WriteLine("Guten Morgen!");
Console.WriteLine("Wie geht es Ihnen?");
Console.WriteLine("Bis bald.");
Guten Morgen!
Wie geht es Ihnen?
Bis bald.

Die Meldungen kommen dabei in Wellen. Beim ersten Start meldet der Compiler vier Fehler in den Zeilen 2 bis 4, darunter CS1003 und CS1026 (ein fehlendes Komma, eine fehlende Klammer). Diese beiden sind nur Folgen des fehlenden Anführungszeichens und verschwinden mit ihm. Danach bleibt nur das fehlende Semikolon übrig. Erst wenn auch das ergänzt ist, meldet er console und Writeline: Er prüft die Namen erst, wenn der Satzbau stimmt. Genau deshalb lohnt es sich, immer den obersten Fehler zuerst zu beheben und dann neu zu starten.

Übung 3

Für die Kür: Zeichnen Sie mit Zeichen einen Rahmen um Ihren Namen, ungefähr so:

+--------------+
| Ada Beispiel |
+--------------+

Lösung 3

C#
// rahmen.cs
Console.WriteLine("+--------------+");
Console.WriteLine("| Ada Beispiel |");
Console.WriteLine("+--------------+");

Damit der Rahmen genau passt, braucht die obere und untere Linie so viele Striche, wie der Name lang ist, plus zwei für die Leerzeichen. Bei einem anderen Namen zählen Sie nach. Dass der Computer so etwas auch selbst ausrechnen kann, sehen Sie in den nächsten Lektionen.

Was Sie jetzt können

  • Sie legen eine .cs-Datei an und starten sie mit dotnet run.
  • Sie geben mit Console.WriteLine und Console.Write Text aus, auch mit Anführungszeichen darin.
  • Sie schreiben Kommentare.
  • Sie lesen eine Fehlermeldung: Datei, Zeile, Zeichen, Fehlernummer, Text. Sie beheben den obersten Fehler zuerst.
  • Sie wissen, dass der Exit-Code 0 Erfolg bedeutet und jede andere Zahl einen Fehler.

Weiterlesen