Grundlagen: Funktionen
Eine Funktion oder auch Methode oder Routine ist ein Teil einer Klasse, um Programmcode auszulagern. Oft handelt es sich hierbei auch um Code, der öfters gebraucht wird. Dies ist jedoch nicht zwingend notwendig. Bisher haben wir den kompletten Programmcode in der Main-Methode notiert, welche den Haupteinstiegspunkt einer Applikation darstellt. Eine Funktion bildet immer einen Block mit geschweiften Klammern, jedoch können die Klammern hier nicht weggelassen werden. Die Zeile über den geschweiften Klammern wird auch als Funktions-Kopf bezeichnet: Hier werden Zugriffsmodifizierer, Rückgabetyp, Name und Parameter angegeben.
Der Zugriffsmodifizierer ist ein Schlüsselwort, welches angibt, von wo aus der Zugriff auf die Funktion erlaubt ist. Durch den Zugriffsmodifizierer private grenzen wir den Zugriff auf die eigene Klasse ein. Mit protected grenzen wir den Zugriff auf die eigene und die davon abgeleitete Klasse ein. public erlaubt einen Zugriff von außerhalb der Klasse. Zugriffsmodifizierer können auch für globale Variablen, also Membervariablen, verwendet werden. Wird der Zugriffsmodifizierer weggelassen, handelt es sich standardmäßig um private.
Der Rückgabetyp kann jeder Datentyp sein. Jedoch kann eine Funktion immer nur einen Wert zurückgeben. Falls eine Funktion keinen Wert zurückgeben soll, müssen wir das Schlüsselwort void angeben. Die Rückgabe eines Wertes erfolgt mit dem Schlüsselwort return und dem Wert. Das Schlüsselwort return (ohne Wert) wird auch dazu eingesetzt, um eine Funktion ohne Rückgabetyp frühzeitig zu verlassen.
Der Name einer Funktion darf nur einmal innerhalb einer Klasse existieren. Eine Ausnahme bildet die Methodenüberladung. Dazu nachher mehr.
Die Parameter einer Funktion können ebenfalls jeden Datentyp haben und werden nach dem Funktions-Namen in runden Klammern notiert. Die Anzahl der Parameter ist unbegrenzt, wobei die einzelnen Parameter mit Kommas getrennt werden. Es ist auch möglich, dass eine Funktion keine Parameter haben. In diesem Fall werden die runden Klammern leer gelassen. Als Parameter können ebenfalls auch Arrays übergeben werden. Ein Parameter wird im Funktions-Kopf mit dem Datentyp und dem Namen angegeben. Der Name des Parameters kann dann innerhalb der Funktion verwendet werden.
Bei der Methodenüberladung können wir mehrere Funktionen mit demselben Namen erstellen, welche sich durch die Parameter unterscheiden müssen. Eine Unterscheidung der Parameter erfolgt an Hand der Datentypen oder der Anzahl. Eine Unterscheidung durch den Rückgabetyp ist nicht möglich. Als Beispiel für eine Methodenüberladung könnten wir eine Additions-Funktion nennen, welche einmal mit 2 Zahlen und einmal mit 3 Zahlen arbeitet. Dies wäre eine Unterscheidung an Hand der Parameter-Typen. Eine andere Möglichkeit wäre, eine Funktion zur Addition, welche einmal int-Typen erwartet und ein anderes Mal double-Typen. Dies wäre eine Unterscheidung durch die Datentypen der Parameter. Grundsätzlich könnten zwei verschiedene Funktionen der Methodenüberladung komplett andere Anweisungen durchführen, da beide Funktionen einen eigenen Code-Block besitzen. Normalerweise ist dies jedoch nicht geläufig, da dadurch die Struktur des Programms „zerstört“ wird.
Das Schlüsselwort static kann bei Funktionen oder Variablen eingesetzt werden, um eine Funktion oder Variable ohne Objekt-Bindung zu erstellen, d. h. die Funktion oder Variable existiert unabhängig von einem Objektverweis. Wir können also auf die Funktion oder Variable zugreifen, ohne ein Objekt der Klasse erstellt zu haben. Der Zugriff erfolgt dabei direkt über den Klassennamen. Wie Ihnen vielleicht schon aufgefallen ist, ist die Main-Routine mit diesem Schlüsselwort versehen. Da wir im Beispiel alle Routinen direkt über die Main-Funktion aufrufen und kein Objekt der Klasse Programm erstellt haben, benötigen wir auch bei allen Beispiel-Funktionen das Schlüsselwort static. Dies kommt daher, dass statische Funktionen keine nicht-statische Funktionen aufrufen können (da kein Objektverweis besteht). Eingeordnet wird das Schlüsselwort zwischen Zugriffsmodifizierer und Rückgabetyp.
Program.cs
using System; namespace CSV20.Funktionen { class Program { static void Main(string[] args) { Console.WriteLine("Sie haben \"{0}\" eingegeben!", TestEingabe()); Console.WriteLine(); Console.WriteLine("Rechnung mit 2 Zahlen: 1 + 2 = {0}", Addition(1, 2)); Console.WriteLine("Rechnung mit 3 Zahlen: 1 + 2 + 3 = {0}", Addition(1, 2, 3)); Console.ReadKey(); } private static string TestEingabe() { Console.Write("Bitte etwas eingeben: "); return Console.ReadLine(); } private static int Addition(int iZahl1, int iZahl2) { return iZahl1 + iZahl2; } // Funktion Addition() wird überladen, wir können also die Funktion mit 2 oder 3 Parametern aufrufen // Methoden-Überladungen müssen sich in den Parametern unterscheiden (Anzahl oder Typ) // eine Unterscheidung durch den Rückgabetyp ist nicht möglich private static int Addition(int iZahl1, int iZahl2, int iZahl3) { return iZahl1 + iZahl2 + iZahl3; } } }