czwartek, 29 listopada 2007

LINQ: sztuczki składniowe C# 3.0 (1)

Dziś dla odmiany postanowiłem zacząć porządnie zgłębiać wiedzę na temat LINQ - wszak to kluczowy element .NET 3.5. Poczytałem trochę i pobawiłem się w Visual Studio. W oglądanych wcześniej przeze mnie przykładach / prezentacjach (z wyjątkiem jednej) zasadniczo brakowało mi głębszego wyjaśnienia dlaczego składnia zapytań taka a nie inna. Trzeba to powiedzieć, że po dokładnym zapoznaniu się z wprowadzonymi "cukierkami składniowymi" C# 3.0 i ich przetwarzaniem przez kompilator od razu lepiej mi się patrzy na te zapytania (w VB 9.0 jest podobnie, choć są pewne różnice, niektórych rzeczy więcej a innych mniej w stosunku do C#). W sumie nie ma w tym wszystkim magii... Jakie to sztuczki? Oto one - w skrócie:

1. Wnioskowanie typów lokalnych zmiennych (local type inference) - nie tracimy tutaj silnego typowania, kompilator na podstawie wyrażenia inicjującego, wstawia odpowiedni typ dla zmiennej lokalnej. Dla klasy Address z propercjami City i Street wygląda to tak:

var a = new Address();
a.City = "Cracow";
a.Street = "Nowa";

2. Wyrażenia lambda - upraszczają składnię metod anonimowych wprowadzonych z C# 2.0, gdzie można było definiować delegację w stylu:

delegate( int a, int b ) { return a + b; }

Teraz możemy uprocić to do postaci:

(int a, int b ) => { return a + b; } czy też
(a, b) => a + b

3. Metody rozszerzające (Extension Methods) - są odpowiedzią na zagadkę: "W jaki sposób dodać nowe publiczne metody do istniejącej już klasy bez dziedziczenia i rekompilacji?" W zasadzie jest to przekombinowana sztuczka składniowa, bo nie jest to cud -:). W klasie statycznej definiujemy publiczną statyczną metodę, której pierwszy argument jest typu, który chcemy rozszerzyć. Stawiamy przed nim słowo this:

public static class MyExtensions
{
public static bool IsElDupa(this string s)
{
return s != "ElDupa";
}
}

Po takiej definicji zamiast pisać:

string str = "test";
bool b = MyExtensions.IsElDupa(str);

możemy zapisać to tak:

string str = "test";
bool b = str.IsElDupa();

Przy czym w tak zdefiniowanej metodzie możemy odwoływać się tylko do publicznych składowych klasy.

ciąg dalszy nastąpi ...

Brak komentarzy: