out — Modyfikator parametrów (odwołanie w C#)out parameter modifier (C# Reference)

out — Słowo kluczowe powoduje, że argumenty przekazywane przez odwołanie.The out keyword causes arguments to be passed by reference. To sprawia, że parametr formalny alias dla argumentu, który musi być zmienną.It makes the formal parameter an alias for the argument, which must be a variable. Innymi słowy żadnych operacji na parametr składa się od argumentu.In other words, any operation on the parameter is made on the argument. Jest on podobny do ref — słowo kluczowe, chyba że ref wymaga zainicjowanej zmiennej przed przekazaniem jej.It is like the ref keyword, except that ref requires that the variable be initialized before it is passed. Jest również, jak w — słowo kluczowe, chyba że in nie zezwala na o nazwie metody zmodyfikować wartość argumentu.It is also like the in keyword, except that in does not allow the called method to modify the argument value. Aby użyć out jawnie użyć parametru, zarówno definicję metody, jak i wywoływania metody out — słowo kluczowe.To use an out parameter, both the method definition and the calling method must explicitly use the out keyword. Na przykład:For example:

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

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

Uwaga

out — Słowo kluczowe można również za pomocą parametru typu ogólnego do określenia, czy parametr typu jest kowariantny.The out keyword can also be used with a generic type parameter to specify that the type parameter is covariant. Aby uzyskać więcej informacji na temat użytkowania out — słowo kluczowe, w tym kontekście, zobacz out (modyfikator ogólny).For more information on the use of the out keyword in this context, see out (Generic Modifier).

Zmienne są przekazywane jako out argumentów nie muszą być zainicjowane przed przesłaniem w wywołaniu metody.Variables passed as out arguments do not have to be initialized before being passed in a method call. Metoda wywoływana jest jednak wymagana do przypisania wartości przed powrotem z metody.However, the called method is required to assign a value before the method returns.

in, ref, I out słowa kluczowe nie są uważane za część podpisu metody na potrzeby rozwiązania przeciążenia.The in, ref, and out keywords are not considered part of the method signature for the purpose of overload resolution. W związku z tym, nie mogą być przeciążone metody, jeśli jedyna różnica polega na to, że jedna metoda przyjmuje strukturę ref lub in argument i drugie out argumentu.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. Poniższy kod, na przykład, nie zostanie skompilowany: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) { }
}

Przeciążenie jest legalny, jest jednak, jeśli jedna metoda przyjmuje strukturę ref, in, lub out argument, a druga nie ma żadnego z tych modyfikatorów, następująco: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;
}

Kompilator wybiera najlepsze przeciążenie, dopasowując Modyfikatory parametrów do lokacji wywołanie Modyfikatory parametrów używane w wywołaniu metody.The compiler chooses the best overload by matching the parameter modifiers at the call site to the parameter modifiers used in the method call.

Właściwości nie są zmienne i nie można przekazać jako out parametrów.Properties are not variables and therefore cannot be passed as out parameters.

Nie można użyć in, ref, i out słowa kluczowe dla następujących rodzajów metod:You can't use the in, ref, and out keywords for the following kinds of methods:

  • Metody asynchroniczne, które można zdefiniować przy użyciu async modyfikator.Async methods, which you define by using the async modifier.

  • Metody iteratora, które obejmują yield return lub yield break instrukcji.Iterator methods, which include a yield return or yield break statement.

Deklarowanie out parametrówDeclaring out parameters

Deklarowanie metody z out argumentów jest klasycznego obejście zwracanie wielu wartości.Declaring a method with out arguments is a classic workaround to return multiple values. Począwszy od C# 7.0, należy wziąć pod uwagę krotek dla podobnych scenariuszy.Beginning with C# 7.0, consider tuples for similar scenarios. W poniższym przykładzie użyto out do zwrócenia trzech zmiennych z pojedynczym wywołaniu metody.The following example uses out to return three variables with a single method call. Należy pamiętać, że trzeci argument jest przypisany do wartości null.Note that the third argument is assigned to null. Umożliwia to metody zwrócić wartości opcjonalnie.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);

// The example displays the following output:
//      44
//      I've been returned
//      True

Wywołanie metody z out argumentuCalling a method with an out argument

W języku C# 6 i starszych musi zadeklarować zmienną w osobnych instrukcji, następnie przekazać go jako out argumentu.In C# 6 and earlier, you must declare a variable in a separate statement before you pass it as an out argument. Poniższy przykład deklaruje zmienną o nazwie number przed przekazaniem jej do Int32.TryParse metody, która stara się przekonwertować ciąg na liczbę.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

Począwszy od języka C# 7.0, możesz zadeklarować out zmiennej na liście argumentów wywołania metody, a nie w oddzielnych deklaracji zmiennej.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. Generuje kod w bardziej zwarty, czytelne i uniemożliwia także przypadkowo przypisywania wartości do zmiennej przed wywołaniem metody.This produces more compact, readable code, and also prevents you from inadvertently assigning a value to the variable before the method call. Poniższy przykład jest podobnie jak w poprzednim przykładzie, z tą różnicą, że definiuje on number zmiennej w wywołaniu Int32.TryParse metody.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

W poprzednim przykładzie number zmienna jest silnie typizowane jako int.In the previous example, the number variable is strongly typed as an int. Można również zadeklarować niejawnie typizowanej zmiennej lokalnej, tak jak w poniższym przykładzie.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

Specyfikacja języka C#C# Language Specification

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#.For more information, see the C# Language Specification. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.The language specification is the definitive source for C# syntax and usage.

Zobacz takżeSee also