Modificatore del parametro out (Riferimenti per C#)out parameter modifier (C# Reference)

La parola chiave out fa sì che gli argomenti vengono passati per riferimento.The out keyword causes arguments to be passed by reference. Imposta il parametro formale come alias dell'argomento, che deve essere una variabile.It makes the formal parameter an alias for the argument, which must be a variable. In altre parole, qualsiasi operazione sul parametro viene eseguita sull'argomento.In other words, any operation on the parameter is made on the argument. È come la parola chiave ref, con la differenza che ref richiede l'inizializzazione della variabile prima di essere passato.It is like the ref keyword, except that ref requires that the variable be initialized before it is passed. È anche come la parola chiave in, con la differenza che in non consente al metodo chiamato di modificare il valore dell'argomento.It is also like the in keyword, except that in does not allow the called method to modify the argument value. Per usare un parametro out, la definizione del metodo e il metodo chiamante devono usare in modo esplicito la parola chiave out.To use an out parameter, both the method definition and the calling method must explicitly use the out keyword. Ad esempio:For example:

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

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

Nota

La parola chiave out può essere usata anche con un parametro di tipo generico per specificare che il parametro tipo è covariante.The out keyword can also be used with a generic type parameter to specify that the type parameter is covariant. Per altre informazioni sull'uso della parola chiave out in questo contesto, vedere out (Modificatore generico).For more information on the use of the out keyword in this context, see out (Generic Modifier).

Le variabili passate come argomenti out non devono essere inizializzate prima di essere passate in una chiamata al metodo.Variables passed as out arguments do not have to be initialized before being passed in a method call. È necessario tuttavia che il metodo chiamato assegni un valore prima della restituzione del metodo.However, the called method is required to assign a value before the method returns.

Le parole chiave in, ref e out non sono considerate parte della firma del metodo ai fini della risoluzione dell'overload.The in, ref, and out keywords are not considered part of the method signature for the purpose of overload resolution. Non è quindi possibile eseguirne l'overload se l'unica differenza è che un metodo accetta un argomento ref o in e l'altro un argomento out.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. Il codice seguente, ad esempio, non verrà compilato: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) { }
}

L'overload è consentito, tuttavia, se un metodo accetta un argomento ref, in o out e l'altro non ha alcuno di questi modificatori, come illustrato di seguito: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;
}

Il compilatore sceglie il miglior overload creando una corrispondenza tra i modificatori di parametro nel sito di chiamata e i modificatori di parametro utilizzati nella chiamata al metodo.The compiler chooses the best overload by matching the parameter modifiers at the call site to the parameter modifiers used in the method call.

Le proprietà non sono variabili e quindi non possono essere passate come parametri out.Properties are not variables and therefore cannot be passed as out parameters.

Non è possibile usare le parole chiave in, ref e out per i seguenti tipi di metodi:You can't use the in, ref, and out keywords for the following kinds of methods:

  • Metodi asincroni definiti usando il modificatore async.Async methods, which you define by using the async modifier.

  • Metodi iteratori che includono un'istruzione yield return o yield break.Iterator methods, which include a yield return or yield break statement.

Dichiarazione di parametri outDeclaring out parameters

La dichiarazione di un metodo con argomenti out è un classico espediente per restituire più valori.Declaring a method with out arguments is a classic workaround to return multiple values. A partire da C# 7.0 è possibile usare le tuple per scenari analoghi.Beginning with C# 7.0, consider tuples for similar scenarios. Nell'esempio seguente viene usato out per restituire tre variabili con una sola chiamata al metodo.The following example uses out to return three variables with a single method call. Notare che il terzo argomento è assegnato a null.Note that the third argument is assigned to null. In questo modo i metodi restituiscono i valori facoltativamente.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

Chiamata a un metodo con un argomento outCalling a method with an out argument

In C# 6 e nelle versioni precedenti è necessario dichiarare una variabile in un'istruzione separata prima di passarla come argomento out.In C# 6 and earlier, you must declare a variable in a separate statement before you pass it as an out argument. L'esempio seguente dichiara una variabile denominata number prima che venga passata al metodo Int32.TryParse3, che tenta di convertire una stringa in numero.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

A partire da C# 7.0, è possibile dichiarare la variabile out nell'elenco degli argomenti della chiamata al metodo anziché in una dichiarazione di variabile separata.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. Il codice prodotto risulta più compatto e leggibile e viene impedita l'assegnazione accidentale di un valore alla variabile prima della chiamata al metodo.This produces more compact, readable code, and also prevents you from inadvertently assigning a value to the variable before the method call. L'esempio seguente è uguale all'esempio precedente, ad eccezione del fatto che definisce la variabile number nella chiamata al metodo Int32.TryParse.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

Nell'esempio precedente la variabile number è fortemente tipizzata come int.In the previous example, the number variable is strongly typed as an int. È anche possibile dichiarare una variabile locale tipizzata in modo implicito, come avviene nell'esempio seguente.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

Specifiche del linguaggio C#C# Language Specification

Per altre informazioni, vedere la specifica del linguaggio C#.For more information, see the C# Language Specification. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.The language specification is the definitive source for C# syntax and usage.

Vedere ancheSee also