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.
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Prestazioni delle query LINQ in architetture complesse, il 30 maggio 2011 alle 11:39
- Inside ModelVirtualCasting #5: i servizi, il 7 giugno 2010 alle 17:58
- Routing alla massima potenza, il 7 aprile 2010 alle 08:24
- Open Data Protocol e WCF Data Services, il 2 aprile 2010 alle 15:58
- .NET Framework 4.0 beta 1: Tuple, il 27 maggio 2009 alle 06:00