Kiedy używam var?

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…

16 thoughts on “Kiedy używam var?”

  1. 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.

  2. @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.

  3. 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.

  4. Zgadzam się w 100%, też korzystam z var wybiórczo, tylko tam gdzie na pierwszy rzut oka widać jakiego typu jest zmienna

  5. @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.

  6. Zgadzam się, chociaż mnie osobiście tautologia w stylu:
    Dictionary quux = new Dictionary();

    – wkurza mocniej niż

    var numbers = GetNumbers();

  7. 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ę 🙂

  8. @Wojciech
    No tak – nigdy na szczescie nie bylem zmuszony do takich kombinacji tzn. c# 3.0 i .NET 2.0.

  9. @V2.
    Zamiast Dictionary quux = new Dictionary();
    mozna uzywac
    var quux = new Dictionary();
    Bo wiadomo jaki to typ…

  10. 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.

  11. @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.

  12. 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

  13. 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 🙂

Leave a Reply

Your email address will not be published.