Methoden (C#-Programmierhandbuch)Methods (C# Programming Guide)

Eine Methode ist ein Codeblock, der eine Reihe von Anweisungen enthält.A method is a code block that contains a series of statements. Ein Programm bewirkt die Ausführung der Anweisungen, indem die Methode aufgerufen wird und alle erforderlichen Methodenargumente angegeben werden.A program causes the statements to be executed by calling the method and specifying any required method arguments. In C# werden alle Anweisungen im Kontext einer Methode ausgeführt.In C#, every executed instruction is performed in the context of a method. Die Main-Methode ist der Einstiegspunkt jeder C#-Anwendung und wird von der Common Language Runtime (CLR) aufgerufen, wenn das Programm gestartet wird.The Main method is the entry point for every C# application and it is called by the common language runtime (CLR) when the program is started.

Hinweis

In diesem Thema werden benannte Methoden erläutert.This topic discusses named methods. Informationen über anonyme Funktionen finden Sie unter Anonyme Funktionen.For information about anonymous functions, see Anonymous Functions.

MethodensignaturenMethod Signatures

Methoden werden in einer Klasse oder Struktur deklariert, indem die Zugriffsebene wie z. B. public oder private, optionale Modifizierer wie z. B. abstract oder sealed, der Rückgabewert, der Name der Methode und die Methodenparameter angegeben werden.Methods are declared in a class or struct by specifying the access level such as public or private, optional modifiers such as abstract or sealed, the return value, the name of the method, and any method parameters. Diese Teile bilden zusammen die Signatur der Methode.These parts together are the signature of the method.

Hinweis

Ein Rückgabetyp einer Methode ist nicht Teil der Signatur der Methode, wenn es um die Methodenüberladung geht.A return type of a method is not part of the signature of the method for the purposes of method overloading. Er ist jedoch Teil der Methodensignatur, wenn die Kompatibilität zwischen einem Delegaten und der Methode bestimmt wird, auf die dieser verweist.However, it is part of the signature of the method when determining the compatibility between a delegate and the method that it points to.

Methodenparameter werden in Klammern eingeschlossen und durch Kommas getrennt.Method parameters are enclosed in parentheses and are separated by commas. Leere Klammern geben an, dass für die Methode keine Parameter erforderlich sind.Empty parentheses indicate that the method requires no parameters. Diese Klasse enthält drei Methoden:This class contains three methods:

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

MethodenzugriffMethod Access

Das Aufrufen einer Methode für ein Objekt ähnelt dem Zugreifen auf ein Feld.Calling a method on an object is like accessing a field. Fügen Sie nach dem Objektnamen einen Punkt, den Namen der Methode und Klammern hinzu.After the object name, add a period, the name of the method, and parentheses. Argumente werden innerhalb der Klammern aufgelistet und durch Kommas getrennt.Arguments are listed within the parentheses, and are separated by commas. Die Methoden der Motorcycle -Klasse können also wie im folgenden Beispiel gezeigt aufgerufen werden:The methods of the Motorcycle class can therefore be called as in the following example:

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 und ArgumenteMethod Parameters vs. Arguments

Die Methodendefinition gibt die Namen und Typen aller ggf. erforderlichen Parameter an.The method definition specifies the names and types of any parameters that are required. Wenn aufrufender Code die Methode aufruft, werden für jeden Parameter konkrete Werte bereitgestellt, die als Argumente bezeichnet werden.When calling code calls the method, it provides concrete values called arguments for each parameter. Die Argumente müssen mit dem Parametertyp kompatibel sein, aber der im aufrufenden Code verwendete Name des Arguments (sofern vorhanden) muss nicht mit dem in der Methode definierten Parameternamen identisch sein.The arguments must be compatible with the parameter type but the argument name (if any) used in the calling code does not have to be the same as the parameter named defined in the method. Zum Beispiel:For example:

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

Übergeben als Verweis und Übergeben als WertPassing by Reference vs. Passing by Value

Wenn ein Werttyp an eine Methode übergeben wird, wird anstelle des eigentlichen Objekts standardmäßig eine Kopie übergeben.By default, when a value type is passed to a method, a copy is passed instead of the object itself. Änderungen am Argument haben daher keine Auswirkungen auf die ursprüngliche Kopie in der aufrufenden Methode.Therefore, changes to the argument have no effect on the original copy in the calling method. Sie können einen Werttyp als Verweis übergeben, indem Sie das ref-Schlüsselwort verwenden.You can pass a value-type by reference by using the ref keyword. Weitere Informationen finden Sie unter Übergeben von Werttypparametern.For more information, see Passing Value-Type Parameters. Eine Liste der integrierten Werttypen finden Sie unter Tabelle der Typen und Variablen.For a list of built-in value types, see Value Types Table.

Wenn ein Objekt eines Verweistyps an eine Methode übergeben wird, wird ein Verweis auf das Objekt übergeben.When an object of a reference type is passed to a method, a reference to the object is passed. Das heißt, die Methode erhält nicht das Objekt selbst, sondern ein Argument, das den Speicherort des Objekts angibt.That is, the method receives not the object itself but an argument that indicates the location of the object. Wenn Sie einen Member des Objekts unter Verwendung dieses Verweises ändern, wird die Änderung im Argument in der aufrufenden Methode berücksichtigt, selbst wenn Sie das Objekt als Wert übergeben.If you change a member of the object by using this reference, the change is reflected in the argument in the calling method, even if you pass the object by value.

Sie erstellen einen Verweistyp mithilfe des class -Schlüsselworts, wie im folgenden Beispiel gezeigt.You create a reference type by using the class keyword, as the following example shows.

public class SampleRefType
{
    public int value;
}

Wenn Sie jetzt ein Objekt, das auf diesem Typ basiert, an eine Methode übergeben, wird ein Verweis auf das Objekt übergeben.Now, if you pass an object that is based on this type to a method, a reference to the object is passed. Das folgende Beispiel übergibt ein Objekt des SampleRefType -Typs an die ModifyObject-Methode.The following example passes an object of type SampleRefType to method 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 entspricht im Wesentlichen dem vorherigen Beispiel und übergibt ein Argument als Wert an eine Methode.The example does essentially the same thing as the previous example in that it passes an argument by value to a method. Aber da ein Verweistyp verwendet wird, unterscheidet sich das Ergebnis.But, because a reference type is used, the result is different. Die Änderung, die in ModifyObject am value -Feld des Parameters ( obj) vorgenommen wird, ändert auch das value -Feld des Arguments ( rt) in der TestRefType -Methode.The modification that is made in ModifyObject to the value field of the parameter, obj, also changes the value field of the argument, rt, in the TestRefType method. Die TestRefType -Methode zeigt 33 als Ausgabe an.The TestRefType method displays 33 as the output.

Weitere Informationen zum Übergeben von Verweistypen als Verweis oder als Wert finden Sie unter Übergeben von Verweistypparametern und Verweistypen.For more information about how to pass reference types by reference and by value, see Passing Reference-Type Parameters and Reference Types.

RückgabewerteReturn Values

Methoden können einen Wert an die aufrufende Funktion (den Aufrufer) zurückgeben.Methods can return a value to the caller. Wenn der Rückgabetyp – der vor dem Methodennamen aufgeführte Typ – nicht voidist, kann die Methode den Wert mithilfe des return -Schlüsselworts zurückgeben.If the return type, the type listed before the method name, is not void, the method can return the value by using the return keyword. Eine Anweisung mit der return -Schlüsselwort, gefolgt von einem Wert, der dem Rückgabetyp entspricht, gibt diesen Wert an den Methodenaufrufer zurück.A statement with the return keyword followed by a value that matches the return type will return that value to the method caller.

Der Wert kann an den Aufrufer nach Wert oder, ab C# 7, nach Verweis zurückgegeben werden.The value can be returned to the caller by value or, starting with C# 7, by reference. Werte werden an den Aufrufer nach Verweis zurückgegeben, wenn das Schlüsselwort ref in der Methodensignatur verwendet wird und auf jedes return-Schlüsselwort folgt.Values are returned to the caller by reference if the ref keyword is used in the method signature and it follows each return keyword. Die folgende Methodensignatur und Rückgabeanweisung geben an, dass die Methode eine Variable mit dem Namen estDistance nach Verweis an den Aufrufer zurückgibt.For example, the following method signature and return statement indicate that the method returns a variable names estDistance by reference to the caller.

public ref double GetEstimatedDistance()
{
   return ref estDistance;
}

Das return -Schlüsselwort beendet außerdem die Ausführung der Methode.The return keyword also stops the execution of the method. Wenn der Rückgabetyp voidist, ist eine return -Anweisung ohne Wert immer noch nützlich, um die Ausführung der Methode zu beenden.If the return type is void, a return statement without a value is still useful to stop the execution of the method. Ohne das return -Schlüsselwort wird die Ausführung der Methode beendet, wenn das Ende des Codeblocks erreicht ist.Without the return keyword, the method will stop executing when it reaches the end of the code block. Methoden mit einem anderen Rückgabetyp als „void“ müssen das return -Schlüsselwort verwenden, um einen Wert zurückzugeben.Methods with a non-void return type are required to use the return keyword to return a value. Die folgenden beiden Methoden verwenden z. B. das return -Schlüsselwort, um ganze Zahlen zurückzugeben:For example, these two methods use the return keyword to return integers:

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 den Methodenaufruf selbst an jeder Stelle verwenden, an der ein Wert des gleichen Typs ausreichend ist.To use a value returned from a method, the calling method can use the method call itself anywhere a value of the same type would be sufficient. Sie können den Rückgabewert auch einer Variablen zuweisen.You can also assign the return value to a variable. Beispielsweise wird mit den folgenden beiden Codebeispiele das gleiche Ergebnis erzielt:For example, the following two code examples accomplish the same goal:

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.Using a local variable, in this case, result, to store a value is optional. Es kann die Lesbarkeit des Codes verbessern, oder es kann notwendig sein, wenn Sie den ursprünglichen Wert des Arguments für den gesamten Gültigkeitsbereich der Methode speichern müssen.It may help the readability of the code, or it may be necessary if you need to store the original value of the argument for the entire scope of the method.

Um einen Wert zu verwenden, der nach Verweis von einer Methode zurückgegeben wurde, müssen Sie die Variable ref local deklarieren, wenn Sie diesen Wert modifizieren möchten.To use a value returned by reference from a method, you must declare a ref local variable if you intend to modify its value. Wenn die Planet.GetEstimatedDistance-Methode z.B. einen Double-Wert nach Verweis zurückgibt, können Sie ihn mit Code wie dem folgenden als ref local-Variable definieren:For example, if the Planet.GetEstimatedDistance method returns a Double value by reference, you can define it as a ref local variable with code like the following:

ref int distance = plant 

Die Zurückgabe eines mehrdimensionalen Arrays aus einer Methode, M, die den Inhalt eines Arrays modifiziert, ist nicht vonnöten, wenn die aufrufende Funktion das Array an M übergeben hat.Returning a multi-dimensional array from a method, M, that modifies the array's contents is not necessary if the calling function passed the array into M. Sie können das resultierende Array aus M für den funktionalen Fluss der Werte oder aus stilistischen Gründen zurückgeben. Dies ist jedoch nicht nötig, da C# alle Referenztypen nach Wert übergibt und der Wert eines Arrayverweises ein Zeiger auf das Array ist.You may return the resulting array from M for good style or functional flow of values, but it is not necessary because C# passes all reference types by value, and the value of an array reference is the pointer to the array. In der Methode M sind Änderungen am Inhalt des Arrays durch beliebigen Code beobachtbar, der einen Verweis auf das Array enthält, wie im folgenden Beispiel gezeigt.In the method M, any changes to the array's contents are observable by any code that has a reference to the array, as shown in the following example.

static void Main(string[] args)  
        {  
            int[,] matrix = new int[2, 2];  
            FillMatrix(matrix);  
            // matrix is now full of -1  
        }  

        public static void FillMatrix(int[,] matrix)  
        {  
            for (int i = 0; i < matrix.GetLength(0); i++)  
            {  
                for (int j = 0; j < matrix.GetLength(1); j++)  
                {  
                    matrix[i, j] = -1;  
                }  
            }  
        }  

Weitere Informationen finden Sie unter return.For more information, see return.

Asynchrone MethodenAsync Methods

Mithilfe der Async-Funktion können Sie asynchrone Methoden aufrufen, ohne explizite Rückrufe verwenden oder den Code manuell über mehrere Methoden oder Lambda-Ausdrücke teilen zu müssen.By using the async feature, you can invoke asynchronous methods without using explicit callbacks or manually splitting your code across multiple methods or lambda expressions.

Wenn Sie eine Methode mit dem async -Modifizierer kennzeichnen, können Sie den await Operator in der Methode verwenden.If you mark a method with the async modifier, you can use the await operator in the method. Wenn ein await-Ausdruck in der asynchronen Methode erreicht wird, wird die Steuerung an den Aufrufer zurückgegeben, und die Ausführung der Methode wird angehalten, bis die erwartete Aufgabe abgeschlossen ist.When control reaches an await expression in the async method, control returns to the caller, and progress in the method is suspended until the awaited task completes. Wenn die Aufgabe abgeschlossen ist, kann die Ausführung in der Methode fortgesetzt werden.When the task is complete, execution can resume in the method.

Hinweis

Eine asynchrone Methode wird an den Aufrufer zurückgegeben, wenn sie entweder auf das erste erwartete Objekt trifft, das noch nicht abgeschlossen wurde, oder das Ende der asynchronen Methode erreicht.An async method returns to the caller when either it encounters the first awaited object that’s not yet complete or it gets to the end of the async method, whichever occurs first.

Eine asynchrone Methode kann den Rückgabetyp Task<TResult>, Taskoder „void“ haben.An async method can have a return type of Task<TResult>, Task, or void. Der void-Rückgabetyp wird hauptsächlich zum Definieren von Ereignishandlern verwendet, bei denen ein void-Rückgabetyp erforderlich ist.The void return type is used primarily to define event handlers, where a void return type is required. Auf eine asynchrone Methode, die „void“ zurückgibt, kann nicht gewartet werden, und der Aufrufer einer Methode mit void-Rückgabe kann keine Ausnahmen auffangen, die die Methode auslöst.An async method that returns void can't be awaited, and the caller of a void-returning method can't catch exceptions that the method throws.

Im folgenden Beispiel ist DelayAsync eine asynchrone Methode mit dem Rückgabetyp Task<TResult>.In the following example, DelayAsync is an async method that has a return type of Task<TResult>. DelayAsync enthält eine return -Anweisung, die eine ganze Zahl zurückgibt.DelayAsync has a return statement that returns an integer. Aus diesem Grund muss die Methodendeklaration von DelayAsync den Rückgabetyp Task<int>haben.Therefore the method declaration of DelayAsync must have a return type of Task<int>. Da der Rückgabetyp Task<int>ist, ergibt die Auswertung des await -Ausdrucks in DoSomethingAsync eine ganze Zahl, wie die folgende Anweisung veranschaulicht: int result = await delayTask.Because the return type is Task<int>, the evaluation of the await expression in DoSomethingAsync produces an integer as the following statement demonstrates: int result = await delayTask.

Die startButton_Click -Methode ist ein Beispiel für eine asynchrone Methode mit void-Rückgabetyp.The startButton_Click method is an example of an async method that has a return type of void. Da DoSomethingAsync eine asynchrone Methode ist, muss die Aufgabe für den Aufruf von DoSomethingAsync abgewartet werden, wie in der folgenden Anweisung dargestellt: await DoSomethingAsync();.Because DoSomethingAsync is an async method, the task for the call to DoSomethingAsync must be awaited, as the following statement shows: await DoSomethingAsync();. Die startButton_Click -Methode muss mit dem async -Modifizierer definiert werden, da die Methode über einen await -Ausdruck verfügt.The startButton_Click method must be defined with the async modifier because the method has an await expression.

// 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

Mit einer asynchronen Methode können keine ref- oder out-Parameter deklariert, jedoch Methoden aufgerufen werden, die solche Parameter aufweisen.An async method can't declare any ref or out parameters, but it can call methods that have such parameters.

Weitere Informationen über asynchrone Methoden finden Sie unter Asynchronous Programming with async and await (Asynchrone Programmierung mit Async und Await), Ablaufsteuerung in asynchronen Programmen und Asynchrone Rückgabetypen.For more information about async methods, see Asynchronous Programming with async and await, Control Flow in Async Programs, and Async Return Types.

AusdruckstextdefinitionenExpression Body Definitions

Es gibt häufig Methodendefinitionen, die einfach direkt das Ergebnis eines Ausdrucks zurückgeben oder eine einzige Anweisung als Text der Methode aufweisen.It is common to have method definitions that simply return immediately with the result of an expression, or that have a single statement as the body of the method. Es ist eine Syntaxabkürzung zur Definition solcher Methoden mithilfe von =>verfügbar:There is a syntax shortcut for defining such methods using =>:

public Point Move(int dx, int dy) => new Point(x + dx, y + dy);   
public void Print() => Console.WriteLine(First + " " + Last);  
// Works with operators, properties, and indexers too.  
public static Complex operator +(Complex a, Complex b) => a.Add(b);  
public string Name => First + " " + Last;   
public Customer this[long id] => store.LookupCustomer(id);  

Wenn die Methode void zurückgibt oder es sich um eine asynchrone Methode handelt, muss der Text der Methode ein Anweisungsausdruck sein (wie bei Lambdas).If the method returns void or is an async method, then the body of the method must be a statement expression (same as with lambdas). Eigenschaften und Indexer müssen schreibgeschützt sein. Verwenden Sie darüber hinaus nicht das get-Accessorschlüsselwort.For properties and indexers, they must be read only, and you don't use the get accessor keyword.

IteratorsIterators

Ein Iterator führt eine benutzerdefinierte Iteration durch eine Auflistung durch, z. B. eine Liste oder ein Array.An iterator performs a custom iteration over a collection, such as a list or an array. Ein Iterator verwendet die yield return -Anweisung, um jedes Element einzeln nacheinander zurückzugeben.An iterator uses the yield return statement to return each element one at a time. Wenn eine yield return -Anweisung erreicht wird, wird die aktuelle Position im Code gespeichert.When a yield return statement is reached, the current location in code is remembered. Wenn der Iterator das nächste Mal aufgerufen wird, wird die Ausführung von dieser Position neu gestartet.Execution is restarted from that location when the iterator is called the next time.

Sie rufen einen Iterator im Clientcode mithilfe einer foreach Anweisung auf.You call an iterator from client code by using a foreach statement.

Der Rückgabetyp eines Iterators kann IEnumerable, IEnumerable<T>, IEnumeratoroder IEnumerator<T>sein.The return type of an iterator can be IEnumerable, IEnumerable<T>, IEnumerator, or IEnumerator<T>.

Weitere Informationen finden Sie unter Iteratoren.For more information, see Iterators.

C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
Klassen und StrukturenClasses and Structs
ZugriffsmodifiziererAccess Modifiers
Statische Klassen und statische KlassenmemberStatic Classes and Static Class Members
VererbungInheritance
Abstrakte und versiegelte Klassen und KlassenmemberAbstract and Sealed Classes and Class Members
paramsparams
returnreturn
outout
refref
Übergeben von ParameternPassing Parameters