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.