2012-03-26 17 views
8

Ho due metodi:C tipo di riferimento # Passaggio direttamente vs parametro out

public void A(List<int> nums) 
{ 
    nums.Add(10); 
} 

public void B(out List<int> nums) 
{ 
    nums.Add(10); 
} 

Qual è la differenza tra queste due chiamate?

List<int> numsA = new List<int>(); 
A(numsA); 

List<int> numsB = new List<int>(); 
B(out numsB); 

In generale, sto cercando di capire la differenza tra il passaggio dei tipi di riferimento come-è o come parametri.

risposta

0

La parola chiave out fa passare gli argomenti per riferimento. Questo è simile alla parola chiave ref, tranne che ref richiede che la variabile sia inizializzata prima di essere passata. Per utilizzare un parametro out, sia la definizione del metodo sia il metodo di chiamata devono utilizzare esplicitamente la parola chiave out . Per esempio:

http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx

6

Nel tuo esempio, il metodo B non riuscirà a compilare, perché un parametro out è considerato essere inizializzato, in modo da avere inizializzare prima di poterlo utilizzare. Inoltre, quando si chiama un metodo con un parametro out, è necessario specificare la parola chiave out sul sito chiamata:

B(out numsB); 

E non è necessario per inizializzare la variabile numbsB prima della chiamata, perché sarà sovrascritto con il metodo.

Jon Skeet ha un grande articolo che spiega i vari modi per passare parametri: Parameter passing in C#

0

Nella versione B, la funzione ha accesso diretto alla variabile. È come la parola chiave 'ref', con la differenza che la variabile deve essere assegnata dalla funzione che assume il parametro. Ti consente di restituire più valori da una funzione. E la sintassi della chiamata è 'B (out numsB);'

3

Un parametro non-ref, non-out, come una variabile locale, denota una posizione di memoria. Se il tipo di percorso di archiviazione è un tipo di riferimento, il percorso di archiviazione contiene un riferimento a un'istanza di quel tipo.

I parametri di rifasamento e di uscita, al contrario, contengono un riferimento a un percorso di archiviazione. Quella posizione di memoria potrebbe essere una variabile locale, un campo o un elemento di matrice. In altre parole, i parametri ref e out introducono un altro strato di riferimento indiretto. Se si dispone di un parametro di riferimento o di un parametro out in un metodo, rappresenta quindi un riferimento a un riferimento a un oggetto.

Perché si desidera un riferimento a un riferimento a un oggetto? Nel caso in cui è necessario modificare il riferimento all'oggetto (al contrario di modificare l'oggetto stesso).

Questa è una tecnica utile in alcune circostanze ristrette.Ad esempio, si potrebbe desiderare di scrivere una funzione che gli ordini due code a seconda di quale ha il valore più piccolo in alto:

void OrderQueues(ref Queue<int> a, ref Queue<int> b) 
{ 
    if (a.Peek <= b.Peek) return; 
    var temp = a; 
    a = b; 
    b = temp; 
} 

Out parametri sono utili se si desidera restituire più di un valore da un metodo:

In base alla mia esperienza, i parametri di rif and out sono piuttosto rari e ancora più rari con i tipi di riferimento.

Si noti che un parametro di riferimento deve essere inizializzato dal chiamante, mentre un parametro di uscita deve essere inizializzato dal destinatario. Se non si assegna mai un valore al parametro ref, allora dovrebbe essere probabilmente un parametro "normale". Se non si assegna mai un valore a un parametro out, come nell'esempio, il codice non verrà compilato.

Problemi correlati