Dnes večer se v Microsoftu koná přednáška o C# 3.0 a při té příležitosti bych se rád zeptal, jak se vám líbí nebo nelíbí následující zápisy delegátů. (Takto se sice delegáti většinou nepoužívají, ale jde mi čistě o syntaxi.)
C# 1.x:
public delegate int IntOperation(int x);
public static int DoubleMe(int x) {
return x * 2;
}
public static int InvokeNormal1x() {
// základní zápis:
IntOperation del = new IntOperation(DoubleMe);
return del(5);
}
C# 2.0:
public delegate int IntOperation(int x);
public static int DoubleMe(int x) {
return x * 2;
}
public static int InvokeNormal20() {
// zkrácený zápis v C# 2.0:
IntOperation del = DoubleMe;
return del(5);
}
C# 2.0 za použití anonymní metody:
public delegate int IntOperation(int x);
public static int InvokeAnonymous() {
// odpadá nutnost psát metodu DoubleMe
IntOperation del =
delegate(int x) {
return x * 2;
};
return del(5);
}
C# 3.0 – lambda výraz:
public delegate int IntOperation(int x);
public static int InvokeLambda() {
// kratší zápis než v C# 2.0, je ale přehlednější?
IntOperation del = x => x * 2;
return del(5);
}
C# 3.0 – lambda výraz plus generický delegát:
// zde odpadla i nutnost definovat delegáta,
// je ale tento zápis čitelný?
public static int InvokeLambda2() {
Func<int, int> del = x => x * 2;
return del(5);
}
Čím je ukázka níže, tím méně úhozů do klávesnice potřebuje. Připadá mi ale trochu diskutabilní, zda je každý později uvedený příklad snáze srozumitelný (jak to tvrdí třeba Sahil Malik). Jsem rád, když u návratové hodnoty vidím klíčové slovo return. Jsem rád, když na řádku vidím pouze jedno rovnítko (a ne „MyDelegate = x => x == 1;“). Určitě je to otázka zvyku, ale zatím tak nějak inklinuji k zápisu C# 2.0 s anonymní metodou. Co vy?
P. S. Vím, že lambda výrazy nejsou jen o krátkém zápisu delegátů. Ve skutečnosti se jedná o velmi mocný koncept, který umožňuje další zajímavé věci v LINQu. K přečtení doporučuji článek C# 3.0 and LINQ – Expression Trees.
Také inklinuji k zápisu delegátů v C# 2.0. Přesto si myslím, že lambda výrazy v (D, X)LINQu zápis docela zásadně zpřehledňují. Chystím se o lambda výrazech a dalších konstrukcích v C# 3.0 (anonymní typy, Extension methods) něco napsat, protože mě rozčilují ty věčné nesmyslné komentáře typu " a jeje, MS má klíčové slovo var, který slouží k deklaraci proměnné známé z COMu jako variant".