👋 Nový obsah na borekb.cz

Info Tento blog je v "read-only módu" a nový obsah již nebude přibývat. O vývoji píšu na DevBlog.

Co říkáte přehlednosti zápisu delegátů v C# 3.0?

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.

Zařazeno do kategorií |
Rene (Út, 2006-05-23 15:58):

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

Borek (Út, 2006-05-23 16:52):

2 Rene: Opravdu někdo tak zásadně nechápe var? Asi nenavštěvuju ta správná fóra :)

(Konkrétně var je věc, kterou lze vysvětlit jednou větou. Co si potom chudáci vývojáři počnou s relativně složitými lambda výrazy apod.?)

rarouš (St, 2006-05-24 06:03):

Jednoduše je nemusí využívat ;) Osobně se ale na nové věci v C#3.0/VB.NET9­.0 strašně těšim… Hlavně Extension methods mě uchvátili.

Mifko (St, 2006-05-24 09:46):

to rarous: ono to ani nie je moc o tom, ze „jednoduse je nemusi vyuzivat“, ale nepochopenie niektoreho rysu jazyka znamena, ze citatel nebude rozumiet zdrojovemu kodu. a to by uz mohol byt docela problem (aspon pre daneho citatela) ;)

rarous (Čt, 2006-05-25 04:36):

to jsou ale rysy, se kterými se buď seznámíš a budou se ti líbi (tj budeš je využívat) nebo se ti líbit nebudou (budeš to psát stejně jako dřív) nebo takové věci ani neumíš používat, nevíš o nich apod. V článku je popsaný přechod od delegátů, přes anonymní metody po lambda výrazy, ale vždycky máš možnost psát tak, jak to bylo v předchozích verzích jazyka.

Komentáře jsou uzavřeny (blog je v read-only módu). Pokud mě chcete kontaktovat, můžete mailem.