Perché C # ha sia fuori che ref?

16

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

    
posta Neo 26.07.2015 - 19:36
fonte

4 risposte

32

Per quanto riguarda l'implementazione, sono essenzialmente la stessa cosa, ma out comunica qualcosa che ref non fa: non ti interessa input. Questo significa certe cose per te e agli utensili. Ad esempio, puoi passare una variabile non inizializzata a un parametro out e questo non è un problema, dove altrimenti sarebbe, e all'interno della funzione ti viene richiesto di assegnare un valore al parametro out prima che ritorni, mentre c'è nessun requisito per fare nulla con un valore ref .

    
risposta data 26.07.2015 - 19:42
fonte
6

Per comprendere queste due parole chiave, devi capire cosa significa passare un valore per riferimento . In sostanza significa che, se modifichi la variabile parametro che passi in all'interno del metodo o della funzione, quella variabile mantiene il valore modificato quando la tua funzione termina. Dichiarazione un parametro come ref o out esegue ciò, mentre una variabile di parametro ordinaria manterrebbe il suo valore originale, anche se è stata modificata nella funzione.

Le uniche differenze tra ref e out è che out non richiede di inizializzare la variabile prima di passarla alla funzione, ma ref ; mentre out fa richiede di assegnare qualcosa alla variabile all'interno della funzione, ma ref non lo fa.

    
risposta data 26.07.2015 - 19:53
fonte
2

Hai chiesto.

C# have out and ref, why these two are required. I don't have depth knowledge of C#. Why out and ref parameters are required?

E la risposta è che non sono REQUIRED, java per esempio non ha né 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é sono occasionalmente utili. Ecco perché ce ne sono due e non solo uno - perché è utile fare la distinzione tra "qui è qualcosa, modificalo se vuoi" e "dai a questa cosa un nuovo valore".

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

    
risposta data 31.07.2015 - 05:52
fonte
1

Al loro interno sia ref che out forniscono un meccanismo per passare l'indirizzo di una variabile a un metodo in modo che possa essere aggiornato - assegnando al parametro ref o out aggiorna la variabile nel contesto del chiamante. Dove si differenziano è nelle garanzie: out garantisce che la variabile verrà aggiornata, ref no.

Dall'altro lato della chiamata ci sono differenze simili. Un parametro out per il nostro metodo non è garantito per contenere qualcosa di utile all'arrivo e deve essere impostato su un valore in qualche punto, mentre un parametro ref può essere assunto per avere un valore e non è necessario fare nulla specifico con esso.

Questa differenza ha un impatto sull'analisi del codice, sulla generazione e sull'ottimizzazione che, sebbene non ci sembrino terribilmente la maggior parte del tempo, possono avere alcuni effetti sul modo in cui i nostri programmi finiscono per funzionare. Il generatore di codice può rinviare 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 uso out per le situazioni in cui non mi interessa il contenuto della variabile quando arriva come parametro e ref quando lo faccio.

    
risposta data 27.07.2015 - 03:48
fonte

Leggi altre domande sui tag