Abusi della parola chiave var e poca leggibilità dei generics

di Cristian Civera, in .NET 3.5,

Con C# 3.0 hanno introdotto la nuova parola chiave var per inferire il tipo dalla dichiarazione il cui scopo è principalmente supportare e rendere possibile LINQ. Un po' di codice ormai in giro si trova, ma trovo che a volte questa parola chiave venga abusata.

Sono del parere che non debba essere strumento della nostra pigrizia, ma che venga usata sapientemente. Oltre alle situazioni in cui l'uso è d'obbligo, dove l'assegnazione restituisce un anonymous type, credo var possa essere usato in assegnazioni complesse, solitamente dovute ai generics. Per esempio

var people = new Dictionary<city, />>();
var f = new Func<String, Func<Int32, DateTime>>(miaFunzione);

Non lo userei invece, ma dichiarerei il tipo, per quando l'espressione è semplice e il tipo è ben conosciuto:

var s = "ciao";
var exists = (from c in people
where c.City == "Brescia
select true).FirstOrDefault();
var c = people.Count;

I motivi sono due:

  • se vedo il codice non capisco che tipo sono. Nemmeno l'intellisense te lo segnala finchè non lo usi almeno una volta e non sempre guardo codice da Visual Studio;
  • perdo un po' di controllo sui tipi. Se il metodo o la proprietà cambiano, il significato dell'assegnazione cambia e il codice potrebbe comunque compilare, ma funzionare diversamente. Inoltre, dove posso, preferisco lavorare a livello di interfacce o classi base, perciò specificare il tipo è d'obbligo.

Inoltre un'osservazione sulla leggibilità del codice. Personalmente le assegnazioni, dove secondo me è giustificato usare la var, non piacciono molto. Sono un po' incasinate, non trovate? Se è una variabile di stack in effetti può andare bene così, ma se poi questo tipo lo si restituisce credo sia più appropriato a questo punto fare una classe apposita che ne semplifica l'utilizzo. Ad esempio:

public class Cities : Dictionary<ZipCodes><city, /> { }
public class ZipCodes : List<ZipCode><zipcode /> { }

Non dimentichiamoci infine che esistono gli alias che trovo molto comodo quando uso delegate complessi, anche per uso interno, perché di fatto non creano nuove classi o membri. Per esempio:

using MioInvoker = new Func<String, Func<Int32, DateTime>>;

Ovviamente questa è una mia opinione stilistica personale, infatti l'ho scritta nel mio blog :-)

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