2009-10-28 7 views
5

Niedawno zadałem pytanie tutaj, a ktoś pod warunkiem tej odpowiedzi:Co to jest symbol "=>" robi po mojej metodzie w tym kodzie C#?

private void button1_Click(object sender, EventArgs e) 
{ 
    var client = new WebClient(); 
    Uri X = new Uri("http://www.google.com"); 

    client.DownloadStringCompleted += (s, args) => //THIS, WHAT IS IT DOING? 
    { 
     if (args.Error == null && !args.Cancelled) 
     { 
      MessageBox.Show(); 
     } 
    }; 

    client.DownloadStringAsync(X); 
} 

Co to jest, że => robi? Po raz pierwszy widzę to.

+0

Operator Lambda. Zgodnie z tym, co przeczytałem, jest wymawiane "idzie do", gdy głośno się wypowiada (tak jak na marginesie). –

+1

http://msdn.microsoft.com/en-us/library/bb397687.aspx, aby uzyskać więcej informacji .... –

Odpowiedz

10

Zasadniczo mówi „Daję ci tę (s,b)” i wracają mi s*b lub coś, a jeśli używasz lambda wyrażeń, ale może to być coś takiego: Daję ci tę (s,b) i zrobić coś z im w bloku oświadczenie jak:

{ 
    int k = a+b; 
    k = Math.Blah(k); 
    return k; 
} 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Wyrażenie jest nienazwaną metodą napisaną zamiast instancji delegata. Kompilator natychmiast przekształca wyrażenia lambda albo:

  • Instancja delegat
  • Wyrażenie Drzewo

delegate int Transformer(int i);

class Test{ 
    static void Main(){ 
    Transformer square = x => x*x; 
    Console.WriteLine(square(3)); 
    } 

} 

mogliśmy przerobić go tak:

delegate int Transformer(int i);

class Test{ 
    static void Main(){ 
    Transformer square = Square; 
    Console.WriteLine(square(3)); 
    } 
    static int Square (int x) {return x*x;} 
} 

Wyrażenie lambda ma następującą postać:

(parameters) => expression or statement-block

w poprzednim przykładzie występuje pojedynczy parametr x i ekspresja jest x*x

w przykładzie X odpowiada do parametru i, a wyrażenie x*x odpowiada typowi zwrotnemu int, w związku z czym jest kompatybilne z delegatem transformatora; Kod

delegate int Transformer (int i);

lambda ekspresja może być blok oświadczenie zamiast wyrażeniem. Możemy przerobić nasz przykład w następujący sposób:

x => {return x*x;} 

drzewa wyrażenie, typu Expression<T>, reprezentujących kod wewnątrz wyrażenia lambda w przesuwny modelu obiektowego.Umożliwia to późniejszą interpretację wyrażenia lambda w czasie wykonywania (należy sprawdzić "Wyrażenie zapytania" dla LINQ)

19

To jest operator lambda. Definiujesz funkcję anonimową, która pobiera dwa argumenty (s, args) (pominięto specyfikatory typów), a treść tej funkcji pojawia się po symbolu =>.

Jest koncepcyjnie taki sam jak ten:

... 
client.DownloadStringCompleted += Foo; 
} 

void Foo(object sender, EventArgs args) 
{ 
    if (args.Error == null && !args.Cancelled) 
    { 
     MessageBox.Show(); 
    } 
}; 
6

=> jest Lambda Operator. Jest to poręczny mały facet, który może sprawić, że twój kod będzie bardziej czytelny i mniej zagracony.