Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc

Proč nenávidím var

ale přesto ho používám.

 

Klíčové slovo var je mezi námi v C# již dlouho dobu. Jeho používání se postupně ustálilo, ale v začátcích se objevovalo prakticky ve všech deklaracích proměnných. Třeba jako

var i = 5;

V tomto případě lze ještě při znalosti chování kompilátoru odvodit, že proměnná bude typu Int32. Ale co třeba tohle

var x = i;

Tak tady už bez znalosti kódu nejde určit typ proměnné x. Kód se stává hůř čitelným. V případě složitějších případů to bez nápovědy IDE, bez složitého dohledávání, ani nejde číst. Mám na mysli, například to, že se chci podívat do kódu jen pomocí prostého textového editoru nebo na webu, aniž bych si musel otevírat projekt. Když vidím takhle použité var, snažím se při review ho přepisovat na konkrétní typ.

Přesto se použití var občas nedá rozumně vyhnout. Jasné je to u anonymních typů, ale občas je dobré nechat složitou práci s odvozením typu na kompilátoru. Vezmu kousek kódu

var students = dbContext.Students;
var smiths = students.Where(o => o.LastName == "Smith");

První pokus o přepsání var na konkrétní typy by mohl vypadat třeba takto

IEnumerable<Student> students = dbContext.Students;
IEnumerable<Student> smiths = students.Where(o => o.LastName == "Smith");

A máme v programu zaděláno na průšvih. Podmínku Where totiž nebude vyhodnocovat databázový server, ale nejprve se načtou všichni studenti na klienta a teprve klient bude podmínku vyhodnocovat. A v případě, že bude následovat

int count = smiths.Count();

Tak jsme v rámci čitelnosti kódu donutili server skutečně načíst a a na klienta poslat všechny řádky tabulky studentů, přenést to všechno přes síť, klienta jsme donutili tyto řádky zpracovat a načíst do paměti, převést na instance třídy Student, následně projít všechny instance třídy Student, provést porovnání a vrátit omezenou množinu instancí třídy Student a na této omezené množině spočítat kolik jich vlastně je. Místo toho aby se databázový server jednoduše podíval do indexu a poslal nám po síti jedno číslo.

Skutečné typ, které v uvedeném případě vygeneruje kompilátor budou

DbSet<Student> students = dbContext.Students;
IQueryable<Student> smiths = students.Where(o => o.LastName == "Smith");

Ještě by šlo akceptovat přepsání na

IQueryable<Student> students = dbContext.Students;
IQueryable<Student> smiths = students.Where(o => o.LastName == "Smith");

Ale v tomhle případě se opět v rámci čitelnosti, nebo možná jednoduchosti psaní kódu, přikloním k použití var a nechám práci s odvozením typu na kompilátoru.

Zveřejněno 18. února 2017 9:25 by arci
Vedeno pod: ,

Komentář

8. března 2017 22:01 by .NET i jiné ...

# Odkazy z prohlížeče – 8.3.2017

CodeProject Custom Expander Control for WPF – CodeProject – samej XAML Simple Custom Fonts Helper in

Neregistrovaní uživatele nemužou přidávat komentáře.
 
Vyvojar.cz na prodej!