C # fornisce il ref
e la out
parola chiave per rendere gli argomenti da passare per riferimento. La semantica dei due è molto simile. L'unica differenza è nell'inizializzazione della variabile svasata:
ref
richiede l'inizializzazione della variabile prima di passarla alla funzione,out
no.out
richiede l'inizializzazione della variabile all'interno della funzione,ref
no.
Anche i casi d'uso di queste due parole chiave sono quasi gli stessi, e il loro uso troppo frequente è che io credo sia considerato un odore di codice (anche se ci sono casi d'uso validi come i modelli TryParse
e TryGetValue
).
Per questo motivo qualcuno potrebbe spiegare, perché ci sono due strumenti molto simili in C # per casi d'uso così ristretti?
Inoltre, su MSDN , si afferma che hanno un comportamento di runtime diverso:
Sebbene le parole chiave ref e out causino comportamenti di runtime diversi, non sono considerate parte della firma del metodo al momento della compilazione.
In cosa differisce il loro comportamento in fase di runtime?
Conclusione
Entrambe le risposte sembrano corrette, grazie ad entrambi. Ho accettato jmoreno perché è più esplicito.
ref
in C ++; puntatori al puntatore oggetto (o primitivo) in questione. cioèInt32.TryParse(myStr, out myInt)
(C #) viene "eseguito" allo stesso modo diint32_tryParse(myStr, &myInt)
(C); l'unica differenza sono alcuni vincoli imposti dal compilatore per prevenire i bug. (Non lo pubblicherò come risposta perché potrei sbagliarmi su come funziona dietro le quinte, ma è così che immagino che funzioni [perché ha senso])