Quando usare gli optional parameter di C# 4

di Cristian Civera, in .NET 4.0,

Ormai si sa: tra le novità di C# 4 vi è la possibilità di usare parametri opzionali nei metodi. Non voglio parlare di come si dichiarano metodi e come si usano, perché già ne parla Andrea in questo articolo. Voglio piuttosto soffermarmi sull'utilità e l'ambito di utilizzo.

Partiamo da un semplice esempio:

public void DoSomething(string s = "")
{
  // Faccio qualcosa
}

Compilandolo possiamo dare un'occhiata all'assembly risultante e analizzare il metodo DoSomething, il cui IL in realtà è identico al passato. Nessuna nuova funzionalità dell'IL quindi, ma solo due attributi applicati ad ogni parametro: Optional e DefaultParameterValue. Entrambi sono contenuti nel namespace System.Runtime.InteropServices e sono solamente informazioni utilizzate dal compilatore. Di fatto possiamo infatti dichiarare il metodo in questo modo:

public void DoSomething([Optional, DefaultParameterValue("")] string s)
{
}

La prima nota interessante riguarda Visual Basic. Fin dalla sua prima versione (per .NET) ha sempre supportato gli optional parameter e il compilatore produce tali attributi. Questo quindi conferma la convergenza dei due linguaggi ed è, una volta tanto, un punto a favore di Visual Basic.

Passiamo quindi all'utilizzo del metodo. Gli attributi vengono letti da Visual Studio e tramite l'intellisense ci viene mostrato il parametro opzionale e il suo valore predefinito. Chiamiamo il metodo senza indicare il parametro:

DoSomething();

Compiliamo e guardando l'assembly possiamo notare che in realtà la chiamata a DoSomething è completa, con tanto di stringa vuota:

DoSomething("");

Questo significa che contrariamente a quanto abbiamo è pensato quando abbiam visto gli optional parameter, non si sostituiscono agli overload dei metodi. Poniamo infatti di avere un assembly A con un metodo che dispone di parametri opzionali. L'assembly B lo referenzia e con la compilazione chiama il metodo con il valore X. In un successivo momento cambiamo l'assembly A e il valore opzionale in Y. L'assembly B continuerà ad usare il valore X. Questo "difetto" non c'è con gli overload dei metodi ed è il medesimo che hanno le costanti nei confronti dei membri statici.

Potremmo dire che "basta saperlo", ma non è così semplice. Meglio evitare certi pericoli e difatti, da quanto mi risulta, gli optional parameter non sono CLS compliant. Non a caso nel .NET Framework 4.0 gli optional paramenter non sono usati e gli overload persistono. Ma allora quando ha senso usarli? Per i membri privati, dove sappiamo che ricompilando i valori comunque cambiano, ma personalmente non mi piace: gli attributi messi per queste cose non mi piacciono.

Il vero motivo per cui esistono è per supportare COM. Insieme a dynamic, gli optional parameter semplificano notevolmente l'interop con componenti farciti di parametri opzionali, primi tra tutti le PIA di Office. Prima di C# 4, chiamare COM era davvero un delirio.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese