Słowo var zostało wprowadzone w C# 3.0, prawdopodobnie ze względu na LINQ i anonimowe typy. Jedni programiści za wszelką cenę unikają tego słowa kluczowego a drudzy zapomnieli o typach i zawsze korzystają var bo w końcu to nowy feature… Nawet Resharper sugeruje aby zawsze używać var ponieważ skraca to składnie. Istnieje też spora trzecia grupa do której m.in. ja należę i postaram się pokazać kilka przykładów.
Moja zasada jest prosta – używam var tylko jeśli w momencie deklaracji można wywnioskować typ, bez żadnych zgadywanek:
var numbers = new int[]{23,3563,463}; var employeeManager = new EmployeeManager();// o ile to nie interfejs var text = "Hello World";
Nie lubię natomiast konstrukcji następującej:
var numbers = GetNumbers(); var manager = GetManager();
Dlaczego? Skąd mam wiedzieć czy GerNumbers zwraca int, double, float, decimal, long czy short? A może zawsze jest wymuszone zwracanie liczby bez znaku? Oczywiście Visual Studio wiele ułatwia i można najechać kursorem na zmienną i przekonać się o typie. Niestety utrudnia to czytelność kodu.
Dlaczego więc niektórzy tak lubią var? Pierwsza sprawa to skraca składnie. Druga – zachęca programistów do lepszego nazewnictwa zmiennych. Moim zdaniem zmienne powinny być bez tego dobrze nazwane, a typ z góry określony – to nie jest język skryptowy. Z tego względu słowo dynamic również musi zostać sporo przemyślane przed użyciem…
Jeśli się nie mylę, to var wprowadzono w kolejnej wersji C# a nie w .NET’a. Otóż jakiś czas temu pisałem soft w Visual Studio 2008, ale na .NET 2.0. C# wtedy był chyba w wersji 3.0. Tak kombinacja pozwalała na używania var oraz Lambda Expressions, ale już LINQ oczywiście nie było, bo pojawił się w wyższej wersji Framework’a.
Wraz z .net 3.5 pojawił się C# 3.0, jednak CLR nadal pozostał w wersji 2.0.
LINQ i wszystko co umożliwiło jego wprowadzenie (czyli var, typy anonimowe, lambdy, extension methods…) to tylko sztuczki nowego kompilatora C#.
Kiedyś to podsumowałem na blogu, bo powodowało sporo zamieszania: http://www.maciejaniserowicz.com/post/2008/03/01/Numerologia-w-NET.aspx .
s/GerNumbers/GetNumbers/g
@Wojciech:
var wprowadzono aby umozliwic LINQ. Bez tego i typow anonimowych niebyloby to mozliwe a przynajmniej w takiej wersji jak dzis. W c# 2.0\.net 2.0 nie bylo mozliwe korzystanie z var.
@Maciej:
Masz racje, aby byc scislym to skladnia jezyka a nie funnkcjonalnosc biblioteki.
Również stosuje podobne zasady używania “var”. Jednak podczas pracy z VS2010 w każdym ww przypadku wystarczy najechać myszą na słówko “var” aby dowiedzieć się jaki zwraca typ.
Tak ale VS nie moze byc wymowka do pisania nieczytelnego kodu:)
Zgadzam się w 100%, też korzystam z var wybiórczo, tylko tam gdzie na pierwszy rzut oka widać jakiego typu jest zmienna
@Piotr “W c# 2.0\.net 2.0 nie bylo mozliwe korzystanie z var.” Oczywiście, że to prawda. Chodziło mi raczej o kombinację .NET 2.0 + C# 3.0 – wtedy var i lambda jest dostępna.
Zgadzam się, chociaż mnie osobiście tautologia w stylu:
Dictionary quux = new Dictionary();
– wkurza mocniej niż
var numbers = GetNumbers();
Ostre nawiasy są jak widzę wycinane (nie wiem zresztą za bardzo, po co, skoro i tak nikt nie stosuje znaczników HTML), więc pierwszy przykład stracił wymowę 🙂
@Wojciech
No tak – nigdy na szczescie nie bylem zmuszony do takich kombinacji tzn. c# 3.0 i .NET 2.0.
@V2.
Zamiast Dictionary quux = new Dictionary();
mozna uzywac
var quux = new Dictionary();
Bo wiadomo jaki to typ…
A co jest złego w tym by stosować var wszędzie gdzie to jest możliwe? Po to jest VS i ReSharper by w chwilach zwątpienia wspomóc nas w rozpoznaniu poprawnego typu. Poza tym człowiek wymusza na sobie stosowanie czytelnych, obrazowych nazw klas, metod, własności i zmiennych. Zapis using “(var db = new SqlConnection()){}” czy “using (var sql = db.CreateCommand()){}” pozwala na bardzo szybkie rozeznanie się co akurat się dzieje zamiast przewijać ekran w prawo celem doczytania przekazywanych parametrów.
@Piotr Zieliński
Wiem, o to mi chodzi właśnie. Po prostu mówię że z dwojga złego – nadużywanie var kontra “niedoużywanie” – bardziej razi mnie to pierwsze.
Poza tym o ile GetNumbers może być double, float czy decimal, o tyle np. wiadomo, że GetCount będzie liczbą naturalną. Teoretycznie może oczywiście być ushort czy long itp., ale bądźmy realistami: w 99 przypadkach na 100 będzie to int… a jeśli się tu pomylimy, to kompilator i tak nas o tym zawiadomi jeszcze w przedbiegach.
Ja unikam korzystania z var z kilku powodów:
– nie zawsze IDE chce nas wspomóc w autouzupełnianiu kodu
– var kojarzy mi się ze wszelkimi językami-wynalazkami (z przymrużeniem oka) a’la delphi
– nie uciekajmy w totalne lenistwo, lepiej już stracić te kilka sekund/minut na własnoręczne rozpoznanie typu
widzę że jestem w opozycji ponieważ zawsze używam var. Staram się używać zmiennych, których nazwy mówią mi o logice programu a nie o użytych typach. Można powiedzieć, że typ jest (w dużym uproszczeniu) dla mnie sprawą drugorzędną. Dzięki temu jak muszę zmienić typ pola w klasie z np int na string to zmieniam klasę i w testach przypisania z 2345 na “2345” ot i koniec roboty 🙂