Ihre Programme werden länger. Bevor Sie im nächsten Schritt das Notizbuch bauen, lernen Sie das wichtigste Werkzeug, um Ordnung zu halten: die eigene Methode. Eine Methode ist ein Stück Code mit einem Namen. Sie schreiben es einmal und rufen es auf, so oft Sie wollen. Console.WriteLine ist auch eine Methode, nur eine, die schon jemand anderes geschrieben hat.

Die erste eigene Methode

C#
// trennlinie.cs
Trennlinie();
Console.WriteLine("Kapitel 1");
Trennlinie();
Console.WriteLine("Es war einmal ...");

static void Trennlinie()
{
    Console.WriteLine("--------------------");
}
--------------------
Kapitel 1
--------------------
Es war einmal ...

Unten steht die Methode, oben wird sie zweimal aufgerufen. Die Teile der ersten Zeile static void Trennlinie():

  • static heißt hier: Die Methode arbeitet nur mit dem, was man ihr ausdrücklich gibt. Sie sieht die Variablen des übrigen Programms nicht. Das hält sie unabhängig und leicht zu verstehen.
  • void heißt: Die Methode gibt nichts zurück. Sie tut nur etwas.
  • Trennlinie ist ihr Name. Methodennamen beginnen groß und beschreiben, was die Methode tut.
  • Die leeren runden Klammern heißen: Sie bekommt nichts mit.

Die Methoden stehen in diesem Kurs immer unter dem Hauptprogramm. Sie werden trotzdem gefunden, wenn oben ihr Name fällt: Der Compiler liest erst die ganze Datei, bevor das Programm startet.

Wollen Sie die Linie länger haben, ändern Sie eine einzige Stelle, nicht jede Zeile, in der sie vorkommt. Das ist der erste große Vorteil von Methoden.

Parameter: der Methode etwas mitgeben

In den runden Klammern stehen die Parameter: Variablen, die der Aufrufer füllt.

C#
// gruss.cs
Gruss("Ada");
Gruss("Linus");
Ueberschrift("Wochenplan", '=');

static void Gruss(string name)
{
    Console.WriteLine($"Hallo, {name}!");
}

static void Ueberschrift(string text, char zeichen)
{
    Console.WriteLine(text);
    Console.WriteLine(new string(zeichen, text.Length));
}
Hallo, Ada!
Hallo, Linus!
Wochenplan
==========

Ueberschrift hat zwei Parameter, getrennt durch ein Komma. Der zweite hat den Typ char, ein einzelnes Zeichen, geschrieben in einfachen Anführungszeichen: '='. new string(zeichen, text.Length) baut einen Text aus so vielen Zeichen, wie die Überschrift lang ist. Damit lässt sich übrigens auch der Rahmen aus Lektion 3 für jeden Namen passend zeichnen.

return: ein Ergebnis zurückgeben

Eine Methode kann etwas ausrechnen und das Ergebnis zurückgeben. Statt void steht dann der Typ des Ergebnisses vor dem Namen, und return gibt den Wert zurück:

C#
// quadrat.cs
int ergebnis = Quadrat(7);
Console.WriteLine(ergebnis);
Console.WriteLine(Quadrat(12));
Console.WriteLine(Quadrat(Quadrat(2)));

static int Quadrat(int zahl)
{
    return zahl * zahl;
}
49
144
16

Der Aufruf Quadrat(7) steht dort, wo man auch eine Zahl schreiben könnte, und wird zu 49. Darum kann ein Aufruf sogar in einem anderen stecken: Quadrat(Quadrat(2)) rechnet erst 2 mal 2, dann 4 mal 4. return beendet die Methode sofort, auch mitten in einer Schleife.

Eine Methode, die Ihnen Arbeit abnimmt

Zahlen sicher einzulesen kostet jedes Mal mehrere Zeilen. Als Methode schreiben Sie das einmal:

C#
// lies-zahl.cs
int alter = LiesZahl("Wie alt sind Sie? ");
int groesse = LiesZahl("Wie groß sind Sie in Zentimetern? ");
Console.WriteLine($"{alter} Jahre, {groesse} Zentimeter.");

static int LiesZahl(string frage)
{
    while (true)
    {
        Console.Write(frage);
        string eingabe = Console.ReadLine() ?? "0";
        if (int.TryParse(eingabe, out int zahl))
        {
            return zahl;
        }
        Console.WriteLine("Bitte eine ganze Zahl mit Ziffern eingeben.");
    }
}
Wie alt sind Sie? sechsunddreißig
Bitte eine ganze Zahl mit Ziffern eingeben.
Wie alt sind Sie? 36
Wie groß sind Sie in Zentimetern? 172
36 Jahre, 172 Zentimeter.

Die Methode fragt so lange, bis eine Zahl kommt, und gibt sie dann mit return zurück. Neu ist ?? "0" statt ?? "": Kommt gar keine Eingabe mehr (Strg+Z oder Strg+D), nimmt die Methode 0, statt endlos weiterzufragen. Das Hauptprogramm oben liest sich jetzt fast wie ein Text: Lies eine Zahl, lies noch eine, schreibe beide.

Gute Namen

Mit Methoden entscheiden Sie, wie Ihr Programm sich liest. Ein paar Regeln, die sich bewährt haben:

  • Methoden tun etwas, also beginnt ihr Name mit einem Verb: LiesZahl, ZeigeAlle, BerechneSumme.
  • Variablen sagen, was in ihnen steckt: anzahlTreffer statt x, suchwort statt s.
  • Eine Methode hat eine Aufgabe. Wenn Sie ihren Namen nur mit „und“ bilden können, etwa LiesUndPruefeUndSpeichere, sind es wahrscheinlich drei Methoden.

Die letzte Regel klingt klein, ist aber die Grundlage von allem, was Profis über guten Aufbau von Software sagen. Sie kommt Ihnen im Aufbaukurs unter dem Namen SOLID wieder entgegen.

Übung 1

Schreiben Sie die Suche nach der größten Zahl aus Lektion 7 als Methode static int Groesste(List<int> zahlen). Rufen Sie sie in groesste-methode.cs für zwei verschiedene Listen auf und geben Sie die Ergebnisse aus. Gehen Sie davon aus, dass die Listen nicht leer sind.

Lösung 1

C#
// groesste-methode.cs
List<int> temperaturen = [12, 17, 9, 21, 15];
List<int> punkte = [88, 95, 71];
Console.WriteLine($"Wärmster Tag: {Groesste(temperaturen)} Grad");
Console.WriteLine($"Beste Punktzahl: {Groesste(punkte)}");

static int Groesste(List<int> zahlen)
{
    int groesste = zahlen[0];
    foreach (int zahl in zahlen)
    {
        if (zahl > groesste)
        {
            groesste = zahl;
        }
    }
    return groesste;
}
Wärmster Tag: 21 Grad
Beste Punktzahl: 95

Einmal geschrieben, funktioniert die Methode für jede Liste. Was sie bei einer leeren Liste täte, wissen Sie aus Lektion 7: zahlen[0] gäbe es nicht, und das Programm bräche ab. Deshalb steht die Annahme in der Aufgabe. Im Aufbaukurs lernen Sie, wie eine Methode so etwas selbst ordentlich meldet.

Übung 2

Machen Sie aus der Schaltjahr-Regel von Lektion 5 eine Methode static bool IstSchaltjahr(int jahr). Geben Sie damit in schaltjahre.cs alle Schaltjahre von 1890 bis 1920 aus, durch Leerzeichen getrennt in einer Zeile.

Lösung 2

C#
// schaltjahre.cs
for (int jahr = 1890; jahr <= 1920; jahr++)
{
    if (IstSchaltjahr(jahr))
    {
        Console.Write($"{jahr} ");
    }
}
Console.WriteLine();

static bool IstSchaltjahr(int jahr)
{
    return (jahr % 4 == 0 && jahr % 100 != 0) || jahr % 400 == 0;
}
1892 1896 1904 1908 1912 1916 1920

Zwischen 1896 und 1904 liegen acht Jahre: 1900 ist durch 100 teilbar, aber nicht durch 400, und damit kein Schaltjahr. Die Methode gibt direkt das Ergebnis der Bedingung zurück, ein if braucht sie dafür nicht.

Übung 3

In diesem Programm wiederholt sich etwas. Räumen Sie es auf, indem Sie eine Methode ZeigeAbschnitt mit zwei Parametern schreiben. Die Ausgabe soll gleich bleiben.

C#
// aufraeumen.cs
Console.WriteLine();
Console.WriteLine("== Einkauf ==");
Console.WriteLine("Brot, Milch, Äpfel");
Console.WriteLine();
Console.WriteLine("== Erledigen ==");
Console.WriteLine("Fahrrad flicken");
Console.WriteLine();
Console.WriteLine("== Anrufen ==");
Console.WriteLine("Oma");

Lösung 3

C#
// aufraeumen.cs
ZeigeAbschnitt("Einkauf", "Brot, Milch, Äpfel");
ZeigeAbschnitt("Erledigen", "Fahrrad flicken");
ZeigeAbschnitt("Anrufen", "Oma");

static void ZeigeAbschnitt(string titel, string inhalt)
{
    Console.WriteLine();
    Console.WriteLine($"== {titel} ==");
    Console.WriteLine(inhalt);
}

== Einkauf ==
Brot, Milch, Äpfel

== Erledigen ==
Fahrrad flicken

== Anrufen ==
Oma

Aus neun Zeilen werden drei Aufrufe, und jeder sagt, was er tut. Soll die Überschrift später anders aussehen, etwa mit -- statt ==, ändern Sie das an einer einzigen Stelle. Prüfen Sie nach so einem Umbau immer, ob die Ausgabe wirklich gleich geblieben ist. Aufräumen heißt: Der Code wird besser, das Verhalten bleibt.

Was Sie jetzt können

  • Sie schreiben Methoden mit static void Name() und rufen sie auf.
  • Sie geben Methoden Parameter mit, auch mehrere.
  • Sie schreiben Methoden, die mit return ein Ergebnis zurückgeben, und benutzen den Aufruf wie einen Wert.
  • Sie lagern wiederholten Code in eine Methode aus und prüfen danach, dass das Verhalten gleich bleibt.
  • Sie wählen Namen, die sagen, was eine Methode tut und was in einer Variablen steckt.

Weiterlesen