100422-N-6357K-008

Una delle cose “scomode” di passare un parametro ad una funziona per reference è che la funzione a questo punto può liberamente modificare il parametro in ingresso con il rischio di produrre side-effect indesiderati. Una cosa del tipo:

struct Person
{
   …
}

static void DoSomething( ref this Person )
{
   …
}

Quello che succede è che da un lato abbiamo ottimizzato le performance perché evitiamo una copia della struttura, come abbiamo introdotto in precedenza, ma allo stesso tempo accettiamo che il metodo DoSomething possa modificare, producendo effetti collaterali inaspettati all’esterno, la struttura stessa.

In for the rescue

la nuova keyword in risolve questo problema e lo fa in maniera molto simile, ed opposta alla già presente keyword out. Mentre quest’ultima impone che un parametro venga modificato la prima previene, sempre in fase di compilazione, che un parametro possa essere modificato. Il codice di cui sopra diventa quindi:

static void DoSomething( in this Person )
{
   …
}

Rendendo di fatto immutabile la struttura in ingresso.