Zawód programisty wiąże się z nieustannym wybieraniem pomiędzy złym, a gorszym. Nie inaczej jest ze słowem kluczowym var.

Czym jest var?

Słowo kluczowe var służy do inferencji typów na poziomie kompilacji C# do CIL. Inferencja polega na ustaleniu typu zmiennej na podstawie przypisywanej wartości. Var ma swoje korzenie w języku F#, gdzie inferencja jest jeszcze bardziej rozbudowana. Nie jest to w żadnym wypadku typ dynamiczny. Słowo kluczowe var można stosować jedynie wewnatrz metody - nie ma możliwości definiowania w ten sposób typów wejściowych i wyjściowych (w przeciwieństwie do F#), czy też typów pól w klasie.

Ponieważ mój .NET trochę zardzewiał (a rdza słabo schodzi, bo nie piję coli ani nie smaruję się WD-40), byłem przekonany, że każdy developer C# używa go wszędzie gdzie się da. Okazało się, że istnieje spore grono wyznawców podawania typów wprost.

Dlaczego warto używać var?

Słowo kluczowe var, a co za tym idzie - ograniczona inferencja typów, nie zostały wprowadzone bez powodu. Do głównych zalet należą:

  • zmiana przypisania wartości nie wymusza zmiany typu zmiennej,
  • zapis jest krótszy i czytelniejszy, szczególnie w przypadku rozbudowanych typów ogólnych (less is more),
  • wymusza przypisywanie wartości do zmiennej w miejscu jej deklaracji,
  • uwalnia od polegania na implementacji na rzecz interfejsu (np. w kolekcjach).
var sheepsCount = 1;
var repository = new ExtendedComplicatedImportantRepository<ModelOne, ModelTwo>();
var element = Elements.Where(e => e.Important.Equals(true));

Dodatkowo var jest jedyną możliwością w przypadku tworzenia instancji typów anonimowych.

var v = new { Amount = 108, Message = "Hello" };

W jakich sytuacjach var jest utrudnieniem?

Stosowanie słowa var w każdej sytuacji wiąże się jednak z pewnymi komplikacjami:

  • na code review nie widać typu zmiennej, przez co trudniej określić intencje autora kodu,
  • korzystanie że źle zaprojektowanego api jest mało czytelne,
  • odczytanie typu poza środowiskiem programistycznym z intellisense jest utrudnione.
var contentUrl = provider.ContentReference;

Spotkałem się również z metodą mieszaną - stosowanie var tylko w przypadku tworzenia nowego obiektu za pomocą konstuktora lub metody wytwórczej.

var element = new Element("Name");
var secondElement = Element.Create("Name");

Podsumowanie

Osobiście stosuję var gdzie się da. Prawdę mówiąc mam wrażenie, że unikanie var jest wymówką dla złego nazywania zmiennych i pól. W końcu nazwa zmiennej powie wszystko o jej zawartości. A co jeżeli…

IRepository<Banana> applesRepository = new Repository<Banana>();
// a lot of crappy code
(...)
// we don't know type of result just because of wrong variable name
applesRepository.First();

Moje podejście dotyczy to jednak tylko moich własnych projektów. Pracując w zespole dużo istotniejsza jest spójność. W moim obecnym projekcie w pracy stosujemy metodę mieszaną.

A wy? Używacie tego słowa kluczowego w swoich projektach?

PS. Jestem na etapie życia, w którym wszystko zaczyna zasuwać jak gepard goniący gazelę. Pisanie kolejnych postów często spada na dalszy plan. Dlatego potrzebowałem motywacji. Postanowiłem rzucić wyzwanie mojemu dobremu kumplowi Arkowi, który właśnie transferuje się z upadającego WP na Androida. Wyzwanie polega na opublikowaniu przynajmniej jednego wpisu w miesiącu. Arek, jak przystało na człowieka o wyglądzie drwala, podniósł rękawicę. Dzięki temu na naszych blogach będzie więcej contentu dla Was :-)