Perché C # ha sia out che ref?


18

C # ha le parole chiave oute ref. Perché sono richiesti questi due? Disclaimer: non ho una profonda conoscenza di C #.


3
Non esiste un duplicato tra siti su Stack Overflow?
Peter Mortensen,


2
Stai chiedendo la differenza tra refe out? Oppure stai chiedendo quale sia l'utilizzo degli argomenti per riferimento ref/ outrispetto agli argomenti per valore (nessun modificatore al parametro)? O entrambi?
Jeppe Stig Nielsen,

1
Sento che questa domanda è simile, ma non del tutto un duplice - almeno se presa dalla prospettiva del design del linguaggio
jmoreno

Risposte:


32

Per quanto riguarda l'implementazione, sono essenzialmente la stessa cosa, ma outcomunicano qualcosa che refnon funziona: non ti interessa l'input. Questo significa certe cose per te e per gli strumenti. Ad esempio, è possibile passare una variabile non inizializzata a un outparametro e questo non è un problema, dove altrimenti sarebbe, e all'interno della funzione è necessario assegnare un valore al outparametro prima che ritorni, mentre non è necessario fare nulla in tutti con un refvalore.


10
Ref vs out è molto più importante per il compilatore che per un programmatore. Il compilatore è obbligato a accertarsi di non leggere una variabile prima che gli venga assegnato un valore e gli outfornisce un modo per farlo che meglio corrisponde al modo in cui si desidera gestire le variabili.
Cort Ammon - Ripristina Monica il

Potresti per favore approfondire: 'out' comunica qualcosa che 'ref' non fa.
Neo,

4
@Neo: Fondamentalmente quello che ho detto nella risposta: comunica che non ti interessa usare questo per l'input, quindi è sicuro passare un valore non inizializzato a un outparametro perché la funzione che lo riceve non leggerà da esso .
Mason Wheeler,

@MasonWheeler Questo è consentito (e / o applicato all'estremità ricevente) dal verificatore, però? Out è solo un attributo, internamente.
Casuale 832,

@ Random832: Mentre Robert ha pubblicato sotto la sua risposta, dai un'occhiata a Eric Lippert (ex compilatore C #) che ne discute su stackoverflow.com/q/2876315
Mason Wheeler,

7

Per comprendere queste due parole chiave, devi capire cosa significa passare un valore per riferimento . In sostanza significa che, se modifichi la variabile di parametro che passi all'interno del metodo o della funzione, quella variabile conserva il suo valore modificato quando la tua funzione esce. Dichiarare un parametro come refo outrealizzare questo, mentre una normale variabile di parametro manterrebbe il suo valore originale, anche se lo si modificasse nella funzione.

Le uniche differenze tra refe outè che outnon richiede di inizializzare la variabile prima di passarla nella funzione, ma lo reffa; mentre out fa avete bisogno di assegnare qualcosa alla variabile all'interno della funzione, ma refnon lo fa.


Non c'è una differenza legata alla varianza?
monocell

Vedi la risposta di Eric Lippert su stackoverflow.com/q/2876315
Robert Harvey,

2

Hai chiesto.

C # è uscito e ref, perché questi due sono richiesti. Non ho una conoscenza approfondita di C #. Perché sono richiesti i parametri out e ref?

E la risposta è che non sono NECESSARI, java per esempio non ha neanche e VB ha solo ref (e lo richiede solo nella dichiarazione del metodo).

Puoi facilmente scrivere un intero programma senza usare nessuno dei due.

Esistono perché occasionalmente sono utili. Ecco perché ce ne sono due e non solo uno - perché è utile fare la distinzione tra "ecco qualcosa, modificalo se vuoi" e "dai a questa cosa un nuovo valore".

Altre lingue hanno priorità diverse e quindi possono o meno includere queste o equivalenti. Potrebbero anche non essere d'accordo sul fatto che l'uno o l'altro sia utile, e quindi potrebbero decidere attivamente di NON implementare l'uno o l'altro.


1

Fondamentalmente entrambi refe outforniscono un meccanismo per passare l'indirizzo di una variabile a un metodo in modo che possa essere aggiornato: l'assegnazione al parametro refo outaggiorna la variabile nel contesto del chiamante. Dove differiscono è nelle garanzie: outgarantisce che la variabile verrà aggiornata, refno.

Dall'altra parte della chiamata ci sono differenze simili. outNon è garantito che un parametro del nostro metodo contenga qualcosa di utile all'arrivo e deve essere impostato su un valore ad un certo punto, mentre si refpuò presumere che un parametro abbia un valore e non abbiamo bisogno di fare nulla di specifico con esso.

Questa differenza ha ripercussioni sull'analisi del codice, sulla generazione e sull'ottimizzazione che, sebbene non ci siano tremendamente evidenti per la maggior parte del tempo, possono avere effetti sul modo in cui i nostri programmi finiscono per funzionare. Il generatore di codice può differire l'allocazione della variabile fino a immediatamente prima della chiamata, l'ottimizzatore potrebbe decidere di riordinare alcune operazioni in modo più efficace in base al contratto, ecc.

In termini di utilizzo: come regola generale utilizzo outper situazioni in cui non mi interessa il contenuto della variabile quando arriva come parametro e refquando lo faccio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.