In C# è possibile gestire il valore di ritorno da un metodo utilizzando le parole chiave ref e out.

Utilizzando la parola chiave ref è necessario inizializzare il valore della variabile prima di poterla utilizzare.

Utilizzando la parola chiave out non è necessario inizializzare il valore della variabile, ovviamente il metodo non può leggerne il valore (dal momento che non è stata inizializzata).

Possiamo riassumere il comportamente di ref e di out nel seguente modo:

ref: il parametro deve essere inizializzato prima di essere passato alla funzione. Eventualmente la funzione può modificarne il valore, e restituirlo modificato. Si parla quindi di parametro di tipo input/output, nel senso che può essere letto dalla funzione (è inizializzato) e può essere restituito (può essere modificato).

out: il parametro può non essere inizializzato. La funzione può modificarne il valore, che viene reso disponibile come output. Si parla quindi di parametro di solo output, in quanto la funzione deve inizializzarlo al suo interno.

Il flusso di esecuzione può essere cosi riassunto:

Prima della chiamata:

  • ref:  la variabile deve essere inizializzata prima di essere passata al metodo chiamato
  • out: la variabile può non essere inizializzata prima di essere passata al metodo chiamato

Durante la chiamata:

  • ref: la variabile può essere letta (in quanto già inizializzata)
  • out: la variabile deve essere inizializzata prima di essere utilizzata

Dopo la chiamata:

  • ref: il valore corrente della variabile viene restituito come parametro. Più costoso in termini di performace.
  • out: non viene passato nulla al chiamante (si tratta della stessa variabile). Piu’ efficiente in termini di performance

Nell’esempio seguente si nota come le variabili x e y, devono prima essere dichiarate (senza assegnare il valore), prima di poter essere utilizzate.

In C# 7 è stato introdotto il nuovo concetto di variabili out: in pratica è possibile dichiarare la variabile di tipo out proprio al momento del loro utilizzo:

In pratica le variabili x e le variabili y vengono dichiarate direttamente come parametri del metodo chiamato. E’ da tenere presente che lo scope non cambia, rispetto al normale utilizzo di out.

Poiché la dichiarazione della variabile avviene come se fosse un normale parametro, è lo stesso compilatore che può analizzarne la natura e quindi fare inference sul tipo: è quindi possibile utilizzare la keyword var nella dichiarazione della variabile.

Ovviamente, quest’ultima dichiarazione può essere utilizzata solo nel caso in cui non si verfichino problemi di overload.

Troviamo spesso l’utilizzo delle variabili out all’interno di funzioni di tipo TryParse(valore, out var i) in cui vengono eseguite operazioni di conversione sicura (es. parse di una stringa in un intero).

Ancora una piccola nota: utilizzando il carattere _ è possibile far in modo che una variabile out non venga considerata.

 

 

http://dotnettortona.net/wp-content/uploads/2017/03/0423.sdt-csharp7.jpghttp://dotnettortona.net/wp-content/uploads/2017/03/0423.sdt-csharp7-150x150.jpgamerlin.NETProgrammazione.NET,C#7,Visual Studio 2017In C# è possibile gestire il valore di ritorno da un metodo utilizzando le parole chiave ref e out. Utilizzando la parola chiave ref è necessario inizializzare il valore della variabile prima di poterla utilizzare. Utilizzando la parola chiave out non è necessario inizializzare il valore della variabile, ovviamente il metodo...La prima Community su .NET a Tortona (AL)