lördag 22 december 2012

C# var?

I C# kan man sedan länge (kom i C# 3.0) använda var för att deklarera en typ. Vid kompilering hittar kompilatorn den avsedda typen. var fungerar som en riktig typ strong type - som om man skrivit den avsedda typen i koden (till skillnad mot dynamic).

Användandet av var är smidigt när man t.ex. inte orkar skriva:

Dock ser man fall där användandet av var enligt min mening missbrukas. 
Jag hävdar att var endast behöver användas i följande fall:
  1. Där typnamnet är extremt långt och det är uppenbart vad det är (likt det första exemplet)
  2. När man skapar upp en ny klass
  3. När man med hjälp av generics hämtar upp en instans av en klass (och typen man hämtar är samma som typen man använder i metodanropet t.ex. IoC.Resolve<Type>)

Nedan visas ett exempel på hur det kan se ut i många C# lösningar, att var används överallt.
Tittar man på koden nedan, tar det ett tag att få en ungefärlig känsla över vad variablerna är.


  1. Vad är orders för något?
  2. Vad är id i foreach loopen?
Enligt min mening är det uppenbart att checkoutProvider är en implementation av ICheckoutProvider.

Man kan också se det såhär:
orders är någon form av Enumerable/Array och jag bryr mig inte om den exakta typen.
id är ett orderid i foreach-loopen och jag bryr mig inte om den exakta typen.

Och detta räcker ju långt egentligen. Fast i många fall hade jag nog hellre skrivit den fullständiga typen:

Dock finns det tillfällen då strong types inte kan användas. Hade koden ovan skrivits som ett LINQ-query expression där man returnerat en anonym typ, fungerar ingenting annat än var (eller dynamic).



Mer information och diskussion om användandet av var 

http://stackoverflow.com/questions/41479/use-of-var-keyword-in-c-sharp
http://www.infoq.com/news/2008/05/CSharp-var
http://beyondrelational.com/modules/2/blogs/79/posts/11536/when-to-use-var-keyword-in-c.aspx


/Nils

Inga kommentarer:

Skicka en kommentar