C# 2.0 language specifications are now available
Chtělo se mi vykřiknout hurá, v okamžiku, když jsem si přečetl začátek emailu, který mi přišel včera v pozdních odpoledních hodínách. "Chlapci" z Microsoftu si pro nás připravili několik překvapení ještě před samotným začátkem PDC.
Ať už to byl Scott Guthrie [1], [2], [3], který odklopil pokličku s připravovaným ASP.NET 2.0. Tak nyní i Eric Gunnerson, když upozornil na novou stránku, kde je možné diskutovat a číst si o nové specifikaci jazyka C# v. 2.0.
Neváhal jsem tedy a ihned jsem si dokument o rozsahu 82 stran stáhl a začal číst a studovat. Specifikace navazuje na současnou specifikaci jazyka C# a rozšiřuje ji o 5 kapitol. V pořadí devatenáctá kapitola seznamuje s novým rozšířením jazyka a je možné se zde dovědět o Generics, Anonymous methods, Iterators a Partial types.
O Generics (šablonách) jsem zde již psal a určitě to nebyl poslední příspěvek tohoto typu. I když uznávám, že to je jedno z rozšíření, které bylo nejvíce očekáváno.
Ale je třeba se zmínit i o Anonymous methods, které umožňují zápis částí kódu "in-line", místo hodnoty, kde je očekáván delegát na metodu. Lepší než o tom psát je převzít jednu z ukázek, která prozradí více než slova:Předpokládejme, že na formuláři je textové pole (TextBox), seznam (ListBox) a tlačítko (Button). Při kliknutí na tlačítko chceme přenést hodnotu z textového pole do seznamu. Při použití Anonymous method bude kód vypadat následovně.
public MyForm() { listBox = new ListBox(...); textBox = new TextBox(...); addButton = new Button(...); addButton.Click += delegate { listBox.Items.Add(textBox.Text); }; }Jak je vidět, Anonymous method se skládají z klíčového slova delegate, nepovinných parametrů a příkazů uzavřených do složených závorek { a }.
Iterators představují metody, které postupně vydávají hodnoty ze seznamu. Pomocí iterátorů můžeme snadněji implementovat různá procházení seznamem hodnot v případě, že používáme k procházení seznamem příkazu foreach. K tomu jsou definovány dva nové příkazy a to
yield returnvydá další hodnotu ze seznamuyield breakinformuje o tom, že průchod seznamem je kompletníOpět asi bude nejjednodušší ukázat vše na příkladu, kdy projdeme seznam (Stack) v opačném pořadí:public class Stack: IEnumerable { int [] items; int count; public void Push(int data) {...} public int Pop() {...} public IEnumerator GetEnumerator() { for (int i = count- 1; i>= 0; --i) { yield return items[i]; } } } class Test { static void Main() { Stack stack = new Stack(); for (int i=0; i<10; i++)="" stack.push(i);="" zde="" vyuzijeme="" iterators="" foreach="" (int="" i="" in="" stack)="" console.write("="" {0}="" ",="" i);="" console.writeline();="" }="" }="" výstupem="" je="" potom="" následující="" seznam="" 9="" 8="" 7="" 6="" 5="" 4="" 3="" 2="" 1="" 0="">10;>
Posledním rozšířením jsou Partial types představující možnost rozdělit třídy, struktury a interface do několika částí a to i souborů v jednom projektu. Toto rozšíření se využije především na projektech, které mají některé části generované, ale jak každý ví, ne všechno je možné vygenerovat a je potřeba zapojit i vlastní kód, který se při případném přegenerování musí vybrat a opět vkládat. S tím už by měl být konec, v případě, že použijeme nového klíčového slova partial.
Jak je možné pozorovat, jsem z těchto rozšíření nadšený, a to jsem přečetl pouze první kapitolu a ještě jsem nestačil přelouskat celou specifikaci. Každopádně v nadcházejícím týdnu se určitě budou objevovat další a další zprávy, které v nás budou vzbuzovat dojem, tohle mít na stole tak budeme pracovat o 100-1500% lépe než doposud :-) A kde si vlastně tuto specifikaci jazyka stáhnout? Že jsem to ještě neprozradil, tak to napravuji a přeji pěkné počteníčko.