Abusi della parola chiave var e poca leggibilità dei generics

Cristian Civera

di Cristian Civera, in .NET 3.5, venerdì 29 agosto 2008 ore 13.07

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

Per inserire un commento, devi avere un account.

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



Segnala su: Facebook MSDN Social Twitter Segnalo Wikio Diggita Technorati Stumbleupon Google Yahoo FriendFeed Delicious Furl

Nella stessa categoria
I più letti del mese
TagCloud
.NET Framework, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5, .NET Framework 4.0, ADO.NET Entity Framework, AJAX, Architettura, ASP, ASP.NET, ASP.NET 2.0, ASP.NET 2.0 per tutti, ASP.NET 4.0, ASPItalia.com, Custom Control, Databinding, Datagrid, HttpRuntime, IIS, Javascript, LINQ, LINQ to Entities, LINQ to SQL, Media Center, Microsoft Expression, Object Oriented Programming, Off Topic, PDC 2008, Silverlight, Silverlight - animazioni, Silverlight 2.0, Silverlight 3.0, User Control, Visual Studio, Windows 7, Windows CardSpace, Windows Client, Windows Communication Foundation, Windows Live Services, Windows Presentation Foundation, Windows Server, Windows Vista, Windows Workflow Foundation, XAML, XBox 360, XHTML, XML, XPS, XSLT
BLOG INFO
  • 199 post, 86 commenti, 42 trackback
  • Feed blog e contenuti tecnici: RSS
  • Feed blog: RSS Atom
IN EVIDENZA