2012-06-26 15 views
9

Quindi sono nuovo di C# e ho difficoltà a comprendere out. Al contrario di solo ritorno qualcosa da una funzioneC# out parametri vs resi

using System; 
class ReturnTest 
{ 
    static double CalculateArea() 
    { 
     double r=5; 
     double area = r * r * Math.PI; 
     return area; 
    } 

    static void Main() 
    { 
     double output = CalculateArea(); 
     Console.WriteLine("The area is {0:0.00}", output); 
    } 
} 

paragonabile a questo

using System; 
class ReturnTest 
{ 
    static void CalculateArea(out double r) 
    { 
     r=5; 
     r= r * r * Math.PI; 
    } 

    static void Main() 
    { 
     double radius; 
     CalculateArea(out radius); 
     Console.WriteLine("The area is {0:0.00}",radius); 
     Console.ReadLine(); 
    } 
} 

Il primo è come avrei generalmente farlo. C'è una ragione per cui potrei voler usare out invece di una semplice dichiarazione di ritorno? Capisco che ref consente la comunicazione a due vie e che in genere non devo usare ref a meno che la funzione non stia facendo qualcosa con la variabile che sto inviando.

Tuttavia c'è una differenza tra le dichiarazioni di uscita e quelle di reso, come mostrato sopra? Sintassi-saggio c'è un motivo per favorire l'uno o l'altro?

+8

Studiare 'Dictionary.TryGetValue' e' int.TryParse' e ​​vedere se questi esempi spiegano l'utilità di 'out'. –

+3

'out' viene utilizzato principalmente quando è necessario restituire più valori non correlati da un metodo. Inoltre, viene spesso utilizzato per simulare i puntatori quando si interpone con codice nativo tramite COM o p/invoke. – dlev

+1

Ricorda che in C/C++ abbiamo dei puntatori. Quando si passa un puntatore a una funzione, è possibile modificarlo all'interno della funzione e il valore cambia anche nella funzione di chiamata. fuori fa più o meno la stessa cosa – carny666

risposta

13

Un buon uso di out invece di return per il risultato è il Try modello che si può vedere in alcune API, ad esempio Int32.TryParse(...). In questo schema, il valore di ritorno viene utilizzato per segnalare il successo o il fallimento dell'operazione (al contrario di un'eccezione) e il parametro out viene utilizzato per restituire il risultato effettivo.

Uno dei vantaggi rispetto a Int32.Parse è la velocità, poiché si evitano eccezioni. Alcuni parametri di riferimento sono stati presentati in quest'altra domanda: Parsing Performance (If, TryParse, Try-Catch)

1

Quando una variabile è interessata e il ritorno è OK. Ma cosa succede se si desidera restituire più di 1 valori? Out aiuta in questo.

static void CalculateArea(out double r, out double Foo) 
{ 
    //Can return 2 values in terms of out variables. 
} 

static double CalculateArea(double r) 
{ 
    // Will return only one value. 
} 
2

È possibile avere più parametri out, quindi se avete bisogno di restituire più valori, è un po 'più facile che creare una classe speciale per i vostri valori di ritorno.

+0

non posso credere di averlo fatto pensa a questo grazie –

4

Solo il tempo tendo a usare out è quando ho bisogno di più cose tornati da un singolo metodo. Out consente di evitare il wrapping di più oggetti in una classe per la restituzione. Guarda l'esempio allo Microsoft Out page.

8

La parola chiave out viene utilizzata principalmente quando si desidera restituire più di un valore da un metodo, senza dover avvolgere i valori in un oggetto.

Un esempio è il metodo Int32.TryParse, che ha sia un valore di ritorno (un valore booleano che rappresenta il successo del tentativo), sia un parametro out che ottiene il valore se l'analisi ha avuto esito positivo.

Il metodo può restituire un oggetto che contiene sia il valore booleano che il numero intero, ma che avrebbe bisogno di creare l'oggetto sull'heap, riducendo le prestazioni del metodo.

+0

Mi chiedo anche circa la differenza di prestazioni (se presente). Venendo da un ambiente C++ l'argomento è che copiare un oggetto quando viene restituito dal valore è più costoso. Questo vale anche per C#? Voglio dire se costruisci un oggetto massiccio nuovo di zecca all'interno della funzione e lo restituisci, verrà copiato in qualunque cosa tu stia assegnando? Al contrario di creare l'oggetto e cambiarlo tramite la parola chiave out? O è irrilevante in C#? – Reasurria

+0

@Reasurria: se si crea un oggetto e lo si restituisce, è solo il riferimento che viene restituito, gli oggetti non sono clonati. Negli oggetti .NET vengono clonati solo se li si specifica in modo specifico, il passaggio degli oggetti non crea nuove copie. – Guffa

+0

Grazie terrò a mente. – Reasurria