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.

Hinweis

In diesem Thema werden benannte Methoden erläutert.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.

Hinweis

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);            
    }
}

Methoden-Parameter VS.-Argumente

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. Beispiel:

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 zur. Ü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).

Wenn ein Objekt eines Referenztyps an eine Methode übergeben wird, wird ein Verweis auf das Objekt übergeben. Das heißt, erhält die Methode nicht das Objekt selbst jedoch ein Argument, das den Speicherort des Objekts angibt. Wenn Sie einen Member des Objekts ändern, indem Sie diesen Verweis verwenden, wird die Änderung im Argument im Aufruf von Methoden spiegelt, auch wenn Sie das - Objekt als Wert übergeben wird.

Sie erstellen einen Referenztyp, indem Sie das - Schlüsselwort class, wie im folgenden Beispiel gezeigt verwenden.

public class SampleRefType
{
    public int value;
}

Wenn Sie ein - Objekt übergeben, das basierend auf diesen Typ zu einer Methode, wird ein Verweis auf das Objekt übergeben. Im folgenden Beispiel wird ein Objekt des Typs SampleRefType an die - Methode ModifyObject.

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;
}

Das Beispiel wird im Wesentlichen die gleiche Aufgabe wie im vorherigen Beispiel darin, dass ein Argument als Wert an eine Methode übergeben wird. Aber, da ein Referenztyp verwendet wird, ist das Ergebnis abweichen. Die Änderung, die in ModifyObject zum value Feld des Parameters gemacht wird, obj, wird auch das value Feld des Arguments, rt, in der TestRefType-Methode. Die TestRefType-Methode zeigt 33 als Ausgabe an.

Weitere Informationen dazu, wie Verweistypen durch Verweis und als Wert, finden Sie unter Übergeben von Verweistypparametern (C#-Programmierhandbuch) und Verweistypen (C#-Referenz) führt.

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);

Verwenden einer lokalen Variablen in diesem Fall ist result, einen - Wert speichert 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).

Async-Methoden

Indem Sie die asynchrone Funktion verwenden, können Sie asynchrone Methoden aufrufen, ohne explizite Rückrufe zu verwenden oder den Code über mehrere Methoden oder Lambda-Ausdrücken manuell zu teilen. Die async Funktion war eingeführtes Visual Studio 2012.

Wenn Sie eine Methode mit dem async-Modifizierer markieren, können Sie den Sie erwarten-Operator in der - Methode verwenden. Wenn Steuerelement einen Erwartungsausdruck in der asynchrone Methode erreicht, kehrt die Steuerung an den Aufrufer zurück, und Status in der - Methode wird angehalten, bis die erwartete Aufgabe ausführt. Wenn die Aufgabe abgeschlossen ist, kann die Ausführung in der Methode fortsetzen.

Hinweis

Eine asynchrone Methode wird an den Aufrufer zurück, wenn eine es zuerst das erwartete Objekt entdeckt, das noch nicht vollständig ist, oder es an das Ende der asynchrone Methode erreicht, das zuerst auftritt.

Eine asynchrone Methode kann einen Rückgabetyp Task, Task oder void haben. Der ungültige Rückgabetyp wird hauptsächlich verwendet, um Ereignishandler zu definieren, in denen ein Ungültiger Rückgabetyp erforderlich ist. Eine asynchrone Methode, die void zurückgibt, kann nicht erwartet werden und der Aufrufer einer void-zurückkehrenden Methode kann Ausnahmen auffangen, die die - Methode auslöst.

Im folgenden Beispiel ist DelayAsync eine asynchrone Methode, die einen Rückgabetyp Task verfügt. DelayAsync verfügt über eine return-Anweisung, die eine ganze Zahl zurückgibt. Daher muss die Methodendeklaration von DelayAsync einen Rückgabetyp Task<int> haben. Da der Rückgabetyp Task<int> ist, erzeugt die Auswertung des Ausdrucks await in DoSomethingAsync eine ganze Zahl, während die folgende Anweisung wird: int result = await delayTask.

Die startButton_Click-Methode ist ein Beispiel für eine asynchrone Methode, die einen Rückgabetyp void verfügt. Da DoSomethingAsync eine asynchrone Methode ist, muss die Aufgabe für den Aufruf von DoSomethingAsync erwartet werden, wie in der folgenden Anweisung dargestellt: await DoSomethingAsync();. Die startButton_Click-Methode muss mit dem async-Modifizierer definiert werden, da die Methode einen await Ausdruck verfügt.

// using System.Diagnostics; 
// using System.Threading.Tasks; 

// This Click event is marked with the async modifier. 
private async void startButton_Click(object sender, RoutedEventArgs e)
{
    await DoSomethingAsync();
}

private async Task DoSomethingAsync()
{
    Task<int> delayTask = DelayAsync();
    int result = await delayTask;

    // The previous two statements may be combined into 
    // the following statement. 
    //int result = await DelayAsync();

    Debug.WriteLine("Result: " + result);
}

private async Task<int> DelayAsync()
{
    await Task.Delay(100);
    return 5;
}

// Output: 
//  Result: 5

Eine asynchrone Methode kann keine Referenz oder Auschecken-Parameter deklarieren, sie kann jedoch Methoden aufrufen, die solche Parameter haben.

Weitere Informationen über asynchrone Methoden, finden Sie unter Asynchrone Programmierung mit Async und Await (C# und Visual Basic), Ablaufsteuerung in asynchronen Programmen (C# und Visual Basic) und Asynchrone Rückgabetypen (C# und Visual Basic).

Iteratoren

Ein Iterator führt eine benutzerdefinierte Iteration über eine Auflistung, wie einer Liste oder einem Array aus. Ein Rendite Iterator verwendet die - Anweisung, um jedes Element einzeln zurückzugeben. Wenn eine Rendite-Anweisung erreicht ist, wird an die aktuelle Position im Code gespeichert. Die Ausführung von diesem Speicherort neu gestartet, wenn der Iterator beim nächsten Mal aufgerufen werden.

Sie rufen den Iterator vom Clientcode auf, indem Sie eine foreach-Anweisung verwenden.

Der Rückgabetyp eines Iterators kann IEnumerable, IEnumerable, IEnumerator oder IEnumerator sein.

Weitere Informationen finden Sie unter Iteratoren (C# und Visual Basic).

C#-Programmiersprachenspezifikation

Weitere Informationen erhalten Sie unter 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)

params (C#-Referenz)

return (C#-Referenz)

out (C#-Referenz)

ref (C#-Referenz)

Übergeben von Parametern (C#-Programmierhandbuch)

Konzepte

C#-Programmierhandbuch