Methoden (C#-Programmierhandbuch)
Eine Methode ist ein Codeblock, der eine Reihe von Anweisungen enthält. Die Anweisungen werden ausgeführt, wenn ein Programm die Methode aufruft und die erforderlichen Methodenargumente übergibt. In C# werden alle Anweisungen im Kontext einer Methode ausgeführt. Die Main-Methode ist der Einstiegspunkt jeder C#-Anwendung. Sie wird beim Starten des Programms von der Common Language Runtime (CLR) aufgerufen.
Tipp
In diesem Thema werden benannte Methoden erläutert. Weitere Informationen über anonyme Funktionen finden Sie unter Anonyme Funktionen (C#-Programmierhandbuch).
Methodensignaturen
Methoden werden in einer Klasse oder Struktur deklariert, indem die Zugriffsebene wie public oder private, optionale Modifizierer wie abstract oder sealed, der Rückgabewert, der Name der Methode sowie ggf. Methodenparameter angegeben werden. Diese Teile bilden zusammen die Signatur der Methode.
Tipp
Ein Rückgabetyp einer Methode ist nicht Teil der Signatur der Methode, wenn es um das Überladen von Methoden geht. Er ist jedoch dann Teil der Signatur der Methode, wenn die Kompatibilität zwischen einem Delegaten und der Methode, auf die er verweist, ermittelt wird.
Methodenparameter sind in Klammern eingeschlossen und durch Kommas getrennt. Leere Klammern geben an, dass die Methode keine Parameter benötigt. Diese Klasse enthält drei Methoden:
abstract class Motorcycle
{
// Anyone can call this.
public void StartEngine() {/* Method statements here */ }
// Only derived classes can call this.
protected void AddGas(int gallons) { /* Method statements here */ }
// Derived classes can override the base class implementation.
public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; }
// Derived classes must implement this.
public abstract double GetTopSpeed();
}
Methodenzugriff
Das Aufrufen einer Methode für ein Objekt ähnelt dem Zugriff auf ein Feld. Fügen Sie hinter dem Objektnamen einen Punkt, den Namen der Methode und die Klammern hinzu. Argumente werden innerhalb der Klammern aufgelistet und durch Kommas voneinander getrennt. Die Methoden der Motorcycle-Klasse können deshalb wie im folgenden Beispiel aufgerufen werden:
class TestMotorcycle : Motorcycle
{
public override double GetTopSpeed()
{
return 108.4;
}
static void Main()
{
TestMotorcycle moto = new TestMotorcycle();
moto.StartEngine();
moto.AddGas(15);
moto.Drive(5, 20);
double speed = moto.GetTopSpeed();
Console.WriteLine("My top speed is {0}", speed);
}
}
Methodenparameter im Vergleich zuArgumente
Die Methodendefinition gibt die Namen und die Typen der ggf. erforderlichen Parameter an. Wenn die Methode von Code aufgerufen wird, werden als Argumente bezeichnete konkrete Werte für die einzelnen Parameter übergeben. Die Argumente müssen mit dem Parametertyp kompatibel sein. Der möglicherweise im aufrufenden Code verwendete Argumentname muss jedoch nicht dem in der Methode definierten Parameternamen entsprechen. Beispiele:
public void Caller()
{
int numA = 4;
// Call with an int variable.
int productA = Square(numA);
int numB = 32;
// Call with another int variable.
int productB = Square(numB);
// Call with an integer literal.
int productC = Square(12);
// Call with an expression that evaulates to int.
productC = Square(productA * 3);
}
int Square(int i)
{
// Store input argument in a local variable.
int input = i;
return input * input;
}
Übergabe als Verweis oderÜbergabe als Wert
Wenn ein Werttyp an eine Methode übergeben wird, wird anstelle des Objekts standardmäßig eine Kopie übergeben. Änderungen am Argument haben daher keine Auswirkungen auf die ursprüngliche Kopie in der aufrufenden Methode. Mit dem ref-Schlüsselwort kann ein Werttyp als Verweis übergeben werden. Weitere Informationen finden Sie unter Übergeben von Werttypparametern (C#-Programmierhandbuch). Eine Liste integrierter Werttypen finden Sie unter Tabelle der Werttypen (C#-Referenz).
Verweistypen werden als Verweis übergeben. Wenn ein Objekt eines Verweistyps an eine Methode übergeben wird, wird auf das ursprüngliche Objekt und nicht auf eine Kopie verwiesen. Durch diesen Verweis vorgenommene Änderungen wirken sich daher auf die aufrufende Methode aus. Ein Referenztyp wird mit dem class-Schlüsselwort erstellt, wie im folgenden Beispiel gezeigt:
public class SampleRefType
{
public int value;
}
Wenn ein auf diesem Typ basierendes Objekt an eine Methode übergeben wird, wird es durch einen Verweis übergeben. Beispiele:
public static void TestRefType()
{
SampleRefType rt = new SampleRefType();
rt.value = 44;
ModifyObject(rt);
Console.WriteLine(rt.value);
}
static void ModifyObject(SampleRefType obj)
{
obj.value = 33;
}
In diesem Beispiel wird im Prinzip der gleiche Vorgang wie im vorherigen Beispiel ausgeführt. Da jedoch ein Referenztyp verwendet wird, wirkt sich die durch ModifyObject vorgenommene Änderung auf das in der TestRefType-Methode erstellte Objekt aus. Die TestRefType-Methode zeigt daher den Wert 33 an.
Weitere Informationen finden Sie unter Übergeben von Verweistypparametern (C#-Programmierhandbuch) und Verweistypen (C#-Referenz).
Rückgabewerte
Methoden können dem Aufrufer einen Wert zurückgeben. Wenn der Rückgabetyp (der vor dem Methodennamen aufgelistete Typ) nicht void ist, kann die Methode den Wert mithilfe des return-Schlüsselworts zurückgeben. Durch eine Anweisung, die aus dem return-Schlüsselwort und einem Wert besteht, der mit dem Rückgabetyp übereinstimmt, wird der Wert an den Methodenaufrufer zurückgegeben. Das return-Schlüsselwort beendet außerdem die Ausführung der Methode. Wenn der Rückgabetyp void ist, können Sie mit einer return-Anweisung ohne Wert die Ausführung der Methode beenden. Ohne das return-Schlüsselwort wird die Ausführung der Methode beim Erreichen des Codeblocks beendet. Damit bei Verwendung des return-Schlüsselworts ein Wert zurückgegeben wird, darf der Rückgabetyp der Methode nicht void sein. Diese beiden Methoden verwenden das return-Schlüsselwort beispielsweise, um ganze Zahlen zurückzugeben:
class SimpleMath
{
public int AddTwoNumbers(int number1, int number2)
{
return number1 + number2;
}
public int SquareANumber(int number)
{
return number * number;
}
}
Um einen von einer Methode zurückgegebenen Wert zu verwenden, kann die aufrufende Methode überall dort, wo ein Wert desselben Typs ausreicht, den Methodenaufruf selbst verwenden. Außerdem können Sie den Rückgabewert einer Variablen zuweisen: Zum Beispiel erreichen die beiden folgenden Codebeispiele dasselbe Ziel:
int result = obj.AddTwoNumbers(1, 2);
result = obj.SquareANumber(result);
// The result is 9.
Console.WriteLine(result);
result = obj.SquareANumber(obj.AddTwoNumbers(1, 2));
// The result is 9.
Console.WriteLine(result);
Die Verwendung einer lokalen Variablen (in diesem Fall result) zum Speichern eines Werts ist optional. Diese Vorgehensweise kann die Lesbarkeit des Codes erhöhen. Sie kann aber auch erforderlich sein, wenn der ursprüngliche Wert des Arguments für den gesamten Bereich der Methode gespeichert werden muss.
Weitere Informationen finden Sie unter return (C#-Referenz).
C#-Programmiersprachenspezifikation
Weitere Informationen finden Sie in der C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.
Siehe auch
Referenz
Klassen und Strukturen (C#-Programmierhandbuch)
Zugriffsmodifizierer (C#-Programmierhandbuch)
Statische Klassen und statische Klassenmember (C#-Programmierhandbuch)
Vererbung (C#-Programmierhandbuch)
Abstrakte und versiegelte Klassen und Klassenmember (C#-Programmierhandbuch)
Übergeben von Parametern (C#-Programmierhandbuch)