Modifizierer für out-Parameter (C#-Verweis)out parameter modifier (C# Reference)

Das Schlüsselwort out bewirkt, dass Argumente per Verweis übergeben werden.The out keyword causes arguments to be passed by reference. Dies entspricht dem Schlüsselwort ref, mit Ausnahme davon, dass bei ref die Variable initialisiert sein muss, bevor sie übergeben wird.It is like the ref keyword, except that ref requires that the variable be initialized before it is passed. Es ähnelt auch dem Schlüsselwort in. Allerdings lässt in nicht zu, dass die aufgerufene Methode den Argumentwert verändern kann.It is also like the in keyword, except that in does not allow the called method to modify the argument value. Um einen Parameter out zu verwenden, müssen sowohl die Methodendefinition als auch die aufrufende Methode das Schlüsselwort out explizit verwenden.To use an out parameter, both the method definition and the calling method must explicitly use the out keyword. Zum Beispiel:For example:

int initializeInMethod;
OutArgExample(out initializeInMethod);
Console.WriteLine(initializeInMethod);     // value is now 44

void OutArgExample(out int number)
{
    number = 44;
}

Hinweis

Das Schlüsselwort out kann auch mit einem generischen Typparameter verwendet werden, um anzugeben, dass der Typparameter kovariant ist.The out keyword can also be used with a generic type parameter to specify that the type parameter is covariant. Weitere Informationen zur Verwendung des Schlüsselworts out in diesem Kontext finden Sie unter out (generischer Modifizierer).For more information on the use of the out keyword in this context, see out (Generic Modifier).

Variablen, die als out-Argumente übergeben wurden, müssen nicht initialisiert werden, bevor sie in einen Methodenaufruf übergeben werden.Variables passed as out arguments do not have to be initialized before being passed in a method call. Die aufgerufene Methode ist jedoch erforderlich, um einen Wert zuzuweisen, bevor die Methode zurückgegeben wird.However, the called method is required to assign a value before the method returns.

Obwohl die Schlüsselwörter in, ref und out unterschiedliche Laufzeitverhalten hervorrufen, gelten sie zum Zeitpunkt der Kompilierung nicht als Teil der Methodensignatur.Although the in, ref, and out keywords cause different run-time behavior, they are not considered part of the method signature at compile time. Aus diesem Grund können die Methoden nicht überladen werden, wenn der einzige Unterschied darin besteht, dass eine Methode ein ref- oder in-Argument übernimmt und die andere ein out-Argument.Therefore, methods cannot be overloaded if the only difference is that one method takes a ref or in argument and the other takes an out argument. Der folgende Code wird z. B. nicht kompiliert:The following code, for example, will not compile:

class CS0663_Example
{
    // Compiler error CS0663: "Cannot define overloaded 
    // methods that differ only on ref and out".
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}

Überladen ist zwar legal, wenn jedoch eine Methode ein ref-, in- oder out-Argument übernimmt und die andere über keinen dieser Modifizierer verfügt, gilt Folgendes:Overloading is legal, however, if one method takes a ref, in, or out argument and the other has none of those modifiers, like this:

class OutOverloadExample
{
    public void SampleMethod(int i) { }
    public void SampleMethod(out int i) => i = 5;
}

Der Compiler wählt die beste Überladung aus, indem er die Parametermodifizierer auf der Aufrufsite den im Methodenaufruf verwendeten Parametermodifizierern zuordnet.The compiler chooses the best overload by matching the parameter modifiers at the call site to the parameter modifiers used in the method call.

Eigenschaften sind keine Variablen und können daher nicht als out-Parameter übergeben werden.Properties are not variables and therefore cannot be passed as out parameters.

Weitere Informationen zum Übergeben von Arrays finden Sie unter Übergeben von Arrays mit „ref“ und „out“.For information about passing arrays, see Passing Arrays Using ref and out.

Sie können keines der Schlüsselwörter in, ref und out für die folgenden Methodentypen verwenden:You can't use the in, ref, and out keywords for the following kinds of methods:

  • Asynchrone Methoden, die Sie mit dem async-Modifizierer definieren.Async methods, which you define by using the async modifier.

  • Iterator-Methoden, die eine yield return- oder yield break-Anweisung enthalten.Iterator methods, which include a yield return or yield break statement.

Deklarieren von out-ArgumentenDeclaring out arguments

Das Deklarieren einer Methode mit out-Argumenten ist nützlich, wenn eine Methode mehrere Werte zurückgeben soll.Declaring a method with out arguments is useful when you want a method to return multiple values. Im folgenden Beispiel wird out verwendet, um mit einem Methodenaufruf drei Variablen zurückzugeben.The following example uses out to return three variables with a single method call. Beachten Sie, dass das dritte Argument Null zugewiesen ist.Note that the third argument is assigned to null. Dadurch können Methoden Werte optional zurückgeben.This enables methods to return values optionally.

void Method(out int answer, out string message, out string stillNull)
{
    answer = 44;
    message = "I've been returned";
    stillNull = null;
}

int argNumber;
string argMessage, argDefault;
Method(out argNumber, out argMessage, out argDefault);
Console.WriteLine(argNumber);
Console.WriteLine(argMessage);
Console.WriteLine(argDefault == null);

Das Try-Muster umfasst die Rückgabe eines bool, um anzugeben, ob ein Vorgang erfolgreich war oder fehlschlug, und die Rückgabe des Werts, der durch den Vorgang in einem out-Argument erzeugt wurde.The Try pattern involves returning a bool to indicate whether an operation succeeded and failed, and returning the value produced by the operation in an out argument. Eine Reihe von Analysemethoden, z.B. DateTime.TryParse), verwendet dieses Muster.A number of parsing methods, such as the DateTime.TryParse method, use this pattern.

Aufrufen einer Methode mit einem out-ArgumentCalling a method with an out argument

In C# 6 und früheren Versionen müssen Sie eine Variable in einer separaten Anweisung deklarieren, bevor Sie es als ein out-Argument übergeben.In C# 6 and earlier, you must declare a variable in a separate statement before you pass it as an out argument. Das folgende Beispiel deklariert eine Variable namens number, bevor sie an die Methode Int32.TryParse übergeben wird, die versucht, eine Zeichenfolge in eine Zahl umzuwandeln.The following example declares a variable named number before it is passed to the Int32.TryParse method, which attempts to convert a string to a number.

string numberAsString = "1640";

int number;
if (Int32.TryParse(numberAsString, out number))
    Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
    Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
//       Converted '1640' to 1640

Ab C# 7.0 können Sie in der Argumentliste des Methodenaufrufs anstatt in einer separaten Variablendeklaration die out-Variable deklarieren.Starting with C# 7.0, you can declare the out variable in the argument list of the method call, rather than in a separate variable declaration. Dies erzeugt kompakteren, lesbaren Code und verhindert auch, dass Sie versehentlich der Variable vor dem Aufruf der Methode einen Wert zuweisen.This produces more compact, readable code, and also prevents you from inadvertently assigning a value to the variable before the method call. Das folgende Beispiel ähnelt dem vorherigen Beispiel, außer dass es die number-Variable im Aufruf der Methode Int32.TryParse) definiert.The following example is like the previous example, except that it defines the number variable in the call to the Int32.TryParse method.

string numberAsString = "1640";

if (Int32.TryParse(numberAsString, out int number))
    Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
    Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
//       Converted '1640' to 1640

Im vorherigen Beispiel ist die number-Variable stark als int typisiert.In the previous example, the number variable is strongly typed as an int. Sie können auch eine implizit typisierte lokale Variable deklarieren, wie es im folgenden Beispiel getan wird.You can also declare an implicitly typed local variable, as the following example does.

string numberAsString = "1640";

if (Int32.TryParse(numberAsString, out var number))
    Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
    Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
//       Converted '1640' to 1640

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#-ReferenzC# Reference
C#-ProgrammierhandbuchC# Programming Guide
C#-SchlüsselwörterC# Keywords
MethodenparameterMethod Parameters