Jeg brugte min eftermiddag igår i selskab med Mads og Rasmus, hvilket var super hyggeligt, og som altid lærerigt.
Vi brugte bla. lidt tid på at snakke om C# 3.0 keywordet “var”, og faktisk også en del tid på både LINQ, Lamda’s og expression trees.
Hvis du ikke kender “var” keywordet kan det bedst beskrives således:
Beginning in Visual C# 3.0, variables that are declared at method scope can have an implicit type var. An implicitly typed local variable is strongly typed just as if you had declared the type yourself, but the compiler determines the type
Jeg vil gerne, i de fleste tilfælde, argumentere imod at bruge “var” som erstatning for angivelsen af den reele type. Jeg mener, at koden bliver mere læsbar og mindre kludret ved at undgå brugen af “var”.
Selv bruger jeg kun “var” i sammenspil med LINQ, Lamda’s og løkker, men min brug af det er mere en vane end et design valg. Hvilket jeg nok burde lave om på.
Jeg har hørt mange sige, at “var” er rigtig god når ens kode bliver kompleks, f.eks ved generiske typer og lange type navne. Kunne man ikke omvendt sige, at hvis ens kode bliver så kompleks eller lang, at man er nødt til at bruge “var”, så skulle man nok ændre koden istedet ?
“var” ødelægger altså gennemskueligeheden af koden, hvis du altså spørger mig, og keywordet gør det ikke lettere at læse eller forstå koden.
private void Bar() {
var name = "Daniel";
var age = 26;
var email = "danielmf@microsoft.com";
var gender = Gender.Male;
var user = new { Username = name, Email = email, Age = age, _Gender = gender };
if ( age <= 19 ) {
var teenagers = new Teenager();
teenagers.Add( user );
teenagers = null;
} else {
var men = new Man();
men.Add( user );
men = null;
}
}
Den samme kode uden “var” er i mine øjne meget mere sigende og gennemskuelig.
private void Bar() {
String name = "Daniel";
Int32 age = 26;
String email = "danielmf@microsoft.com";
Gender gender = Gender.Male;
User user = new { Username = name, Email = email, Age = age, _Gender = gender };
if ( age <= 19 ) {
Teenager teenagers = new Teenager();
teenagers.Add( user );
teenagers = null;
} else {
Men men = new Man();
men.Add( user );
men = null;
}
}
Selvom “var” intet har med dynamisk at gøre kan jeg ikke undgå, at føle det er som om der sker noget “magi” når jeg bruger den. Jeg synes på en eller anden måde, at “var” strider imod den underlæggende type-sikkerhed i sproget, og det bryder jeg mig ikke specielt meget om.
Når det så er sagt, synes jeg resten af de features der er kommet med C# 3.0 er super lækre, og jeg ikke se mig selv komme tilbage til hverken C# 2.0 eller 1.x.
Søren Spelling Lund er inde på noget af det samme i hans lidt ældre blogpost her.