Parameter und Rückgabewert
Lokale Variabeln sind in ihrem Gültigkeitsbereich auf die jeweilige Methode beschränkt, in der sie definiert sind.
Die Verwendung von globalen Variabeln wird der Übersichtlichkeit wegen vermieden! Wie also bekommt man Werte in Methoden hinein, um sie dort zu verarbeiten?
Parameter
bilden die Schnittstelle zu Methoden. Parameter ermöglichen das Kopieren von Werten (oder Referenzen) beim Methodenaufruf. Mit diesen Kopien wird dann innerhalb der Methode weitergearbeitet:
Objekt - Parameter bilden Schnittstellen zu Methoden
- class Program
- {
- static void Main(string[] args)
- {
- int mwStProz = 17; // nur in Main() gültig
- Rechnung rechnung = new Rechnung();
- rechnung.mwSt(50, mwStProz); // "Argumente", auch "tatsächliche o. aktuelle Parameter"
- }
- }
- class Rechnung
- {
- public void mwSt(double summe, int mwStProz) // Definition ("formaler") "Parameter"
- {
- Console.WriteLine(summe * mwStProz / 100);
- }
- }
Mit dem Aufruf der Methode mwSt() in Zeile 8 werden die Argumente in die lokalen Variablen summeund mwStProz kopiert: 50 in die Variable summe und der Inhalt von mwStProz aus Main() in die lokale Variable mwStProzder Methode mwSt(). Die Anzahl der Parameter ist beliebig, aber die Reihenfolge der Argumente darf nicht vertauscht werden.
Obiges Beispiel ist allerdings verbesserungswürdig. Ausgaben in der Logikschicht bzw. der Klasse Rechnung (Zeile 16) werden vermieden. Sonst muss hier die Klasse Rechnung geändert werden, wenn z.B. das Programm eine graphische Benutzeroberfläche (GUI = graphical user interface) erhält.
Schichtenmodell
Die Mehrwertsteuer muss also in der UI-Schicht und NICHT in der Logikschicht ausgegeben werden. Der Gültigkeitsbereich einer Variable wäre auf die Methode mwSt() beschränkt. Wie bekommt man also einen Wert aus Methoden in die aufrufende Methode zurück?
(lat. persistere = Dauerhaftigkeit, Beharrlichkeit, Ausdauer, Eigensinn, Kontinuität)
Rückgabewert
Eine Methode kann maximal einen Wert zurückgeben. Dieser Rückgabewert (return code) enthält entweder das Ergebnis oder einen Fehlercode, der in der aufrufenden Methode ausgewertet werden kann.
Objekt - Methode gibt einen Wert zurück
- class Program
- {
- static void Main(string[] args)
- {
- int mwStProz = 17;
- Rechnung rechnung = new Rechnung();
- double mwSt = rechnung.mwSt(50, mwStProz); // Rückgabewert speichern
- if (mwSt >= 0)
- Console.Write(mwSt);
- else // Auswertung Fehlercode
- Console.Write("Fehler");
- }
- }
- class Rechnung
- {
- public double mwSt(double summe, int mwStProz) // Methode ist vom Typ des Rückgabewertes (hier: double)
- {
- if (mwStProz > 100 || mwStProz < 0)
- return -1; // Rückgabewert -1 für 1. Fehler (Methodenausführung beendet)
- if (summe < 0)
- return -2; // Rückgabewert -2 für 2. Fehler usw.
- return summe * mwStProz / 100; // Rückgabe des Ergebnisses
- }
- }
Im 2. Programmbeispiel wird das Ergebnis zurückgegeben (Zeile 26) oder im Fehlerfall ein Fehlercode (Zeile 22 und 24). Die Auswertung bzw. Ausgabe erfolgt in einer Schicht darüber bzw. in einer aufrufenden Methode.
Die Definition der Methode muss den gleichen Datentyp haben wie der Rückgabewert. (Zeile 19: double mwSt())
Im ersten Programmbeispiel dagegen gab es noch keinen Rückgabewert, die Methode war wie folgt deklariert: void mwSt() (Zeile 14, erstes Programmbeispiel). voidbedeutet u.a. "Leere".
Aber auch wenn eine Methode kein Ergebnis liefert, so ist es trotzdem oft sinnvoll Methoden mit return 0; für "kein Fehler", bzw. mit -1, -2, -3 ... für unterschiedliche Fehler abzuschließen. Nur so lassen sich Methoden automatisiert testen.