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 Argumente7 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üsselwort | Wirkung |
|---|---|
| (keines) | Wert wird kopiert |
ref | Referenz auf die Variable des Aufrufers (muss initialisiert sein) |
out | Ausgabeparameter (wird in der Methode gesetzt) |
in | Referenz, nur lesend (große Strukturen) |
params | beliebig 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)}");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}");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}";
}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)}");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)}");119.00 53.50
Merke
- Ausdruckskörper
=> ausdruckfü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 mitvar (a, b) = ... - Überladen: gleicher Name, andere Parameter
- XML-Kommentare dokumentieren für die IDE
Aufgabe
Schreibe eine Methode (double Mittel, double Abweichung) Statistik(double[] werte).