EMZETT.
Login

Kurz: void Gruss(string name) { Console.WriteLine($“Hallo {name}!”); }

Teil des Kurses C#

Kapitel 5 von 16 im Kurs C#. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

int Addiere(int a, int b) => a + b;                     // Ausdruckskörper
 
void Gruss(string name) { Console.WriteLine($"Hallo {name}!"); }
 
double Potenz(double basis, int exponent = 2)           // Standardwert
{
    double r = 1;
    for (int i = 0; i < exponent; i++) r *= basis;
    return r;
}
 
Console.WriteLine(Addiere(3, 4));
Gruss("Mia");
Console.WriteLine($"{Potenz(3)} {Potenz(2, 10)} {Potenz(exponent: 3, basis: 2)}");   // benannte Argumente

Ausgabe:

7
Hallo Mia!
9 1024 8

Methoden ohne Klasse (lokale Funktionen) sind in Top-Level-Programmen erlaubt. In anderen Dateien stehen sie in Klassen.

Parameterarten

SchlüsselwortWirkung
(keines)Wert wird kopiert
refReferenz auf die Variable des Aufrufers (muss initialisiert sein)
outAusgabeparameter (wird in der Methode gesetzt)
inReferenz, nur lesend (große Strukturen)
paramsbeliebig viele Argumente als Array
void Tausche(ref int a, ref int b) => (a, b) = (b, a);
bool TryTeile(int a, int b, out int ergebnis)
{
    if (b == 0) { ergebnis = 0; return false; }
    ergebnis = a / b;
    return true;
}
int Summe(params int[] zahlen) => zahlen.Sum();
 
int x = 1, y = 2;
Tausche(ref x, ref y);
Console.WriteLine($"{x} {y}");
if (TryTeile(10, 3, out int q)) Console.WriteLine(q);
Console.WriteLine(TryTeile(1, 0, out _));                // _ = Wert ignorieren
Console.WriteLine($"{Summe()} {Summe(1, 2, 3)}");

Ausgabe:

2 1
3
False
0 6

Mehrere Rückgabewerte: Tupel

(int min, int max) MinMax(int[] z) => (z.Min(), z.Max());
(string Name, int Alter) Person() => ("Mia", 17);
 
var (kleinste, groesste) = MinMax(new[] { 5, 3, 9, 1 });
Console.WriteLine($"{kleinste} {groesste}");
var p = Person();
Console.WriteLine($"{p.Name} {p.Alter}");
(int a, int b) = (1, 2);
(a, b) = (b, a);
Console.WriteLine($"{a} {b}");

Ausgabe:

1 9
Mia 17
2 1

Überladen

Lokale Funktionen in Top-Level-Programmen lassen sich nicht überladen. In Klassen geht es:

Console.WriteLine($"{Anzeige.Beschreibe(5)}, {Anzeige.Beschreibe(2.5)}, {Anzeige.Beschreibe("hi")}, {Anzeige.Beschreibe(1, 2)}");
 
static class Anzeige
{
    public static string Beschreibe(int x) => $"int {x}";
    public static string Beschreibe(double x) => $"double {x}";
    public static string Beschreibe(string x) => $"string {x}";
    public static string Beschreibe(int a, int b) => $"zwei ints {a + b}";
}

Ausgabe:

int 5, double 2.5, string hi, zwei ints 3

Rekursion und lokale Funktionen

long Fakultaet(int n) => n <= 1 ? 1 : n * Fakultaet(n - 1);
int Ggt(int a, int b) => b == 0 ? a : Ggt(b, a % b);
 
int Fibonacci(int n)
{
    return Fib(n);
    static int Fib(int k) => k < 2 ? k : Fib(k - 1) + Fib(k - 2);       // lokale Funktion
}
 
Console.WriteLine($"{Fakultaet(10)} {Fakultaet(20)} {Ggt(48, 18)} {Fibonacci(15)}");

Ausgabe:

3628800 2432902008176640000 6 610

Optionale Parameter, Namen und Dokumentation

XML-Kommentare (///) dokumentieren Methoden, die IDE zeigt sie beim Aufruf:

/// <summary>Berechnet den Bruttopreis.</summary>
/// <param name="netto">Nettopreis in Euro</param>
/// <param name="mwst">Steuersatz als Anteil, z. B. 0.19</param>
/// <returns>Der Bruttopreis.</returns>
decimal Brutto(decimal netto, decimal mwst = 0.19m)
{
    if (netto < 0) throw new ArgumentOutOfRangeException(nameof(netto), "darf nicht negativ sein");
    return Math.Round(netto * (1 + mwst), 2);
}
Console.WriteLine($"{Brutto(100)} {Brutto(50m, 0.07m)}");

Ausgabe:

119.00 53.50

Merke

  • Ausdruckskörper => ausdruck für kurze Methoden; Standardwerte und benannte Argumente
  • ref, out, in, params ändern die Übergabe; TryXyz(..., out var ergebnis) ist ein bekanntes Muster
  • Tupel liefern mehrere Werte: (int min, int max); Dekonstruktion mit var (a, b) = ...
  • Überladen: gleicher Name, andere Parameter
  • XML-Kommentare dokumentieren für die IDE

Übungsaufgabe

Schreibe eine Methode (double Mittel, double Abweichung) Statistik(double[] werte).

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Strings und Text

Weiter: Arrays und Collections

Alle Kapitel: C# im Überblick