2015-05-18 15 views
6

Widziałem wiele próbek kodu C# ze składnią =>.użycie i wyjaśnienie => składnia

Czy ktoś może wyjaśnić, na czym polega ta składnia?

select x => x.ID 
+2

[wyrażeń lambda:? Dlaczego ich używam] (http://stackoverflow.com/questions/167343/c-sharp-lambda-expressions-why-should-i-use-them) –

Odpowiedz

10

może ktoś wyjaśnić o co użycie => składni?

Składnia "grubej strzałki" służy do utworzenia czegoś pod nazwą Lambda Expression w języku C#. Jest to jedynie syntaktyczny cukier do tworzenia delegatów.

Wyrażenie podałeś nie ma żadnego sensu, ale widać było kiedyś dużo w LINQ:

var strings = new[] { "hello", "world" }; 
strings.Where(x => x.Contains("h")); 

Składnia x => x.Contains("h") będą wnioskować przez kompilator jako Func<string, bool> który zostanie wygenerowany podczas kompilacji czas.


Edit:

Jeśli naprawdę chcesz zobaczyć, co się dzieje "za kulisami", można zapoznać się z kodem decompiled wewnątrz każdej NET Decompiler:

[CompilerGenerated] 
private static Func<string, bool> CS$<>9__CachedAnonymousMethodDelegate1; 

private static void Main(string[] args) 
{ 
    string[] strings = new string[] 
    { 
     "hello", 
     "world" 
    }; 

    IEnumerable<string> arg_3A_0 = strings; 
    if (Program.CS$<>9__CachedAnonymousMethodDelegate1 == null) 
    { 
     Program.CS$<>9__CachedAnonymousMethodDelegate1 = new Func<string, bool> 
                  (Program.<Main>b__0); 
    } 
    arg_3A_0.Where(Program.CS$<>9__CachedAnonymousMethodDelegate1); 
} 

[CompilerGenerated] 
private static bool <Main>b__0(string x) 
{ 
    return x.Contains("h"); 
} 

Można zobaczyć tutaj, że kompilator utworzył buforowany delegat typu Func<string, bool> o nazwie Program.CS$<>9__CachedAnonymousMethodDelegate1 i nazwaną metodę o nazwie <Main>b__0, która została przekazana do klauzuli Where.

+1

[ ++] dla "grubej strzałki", zawsze zastanawiałeś się, jak możesz to przeszukać. –

4

Ta składnia jest używana do wyrażenia lambda - https://msdn.microsoft.com/en-us/library/bb397687.aspx

delegate int del(int i); 
static void Main(string[] args) 
{ 
    var myDelegateLambda = x => x * x; // lambda expression 
    Func<int, int> myDelegateMethod = noLambda; // same as mydelegate, but without lambda expression 
    int j = myDelegateLambda(5); //j = 25 
} 

private int noLambda(int x) 
{ 
    return x * x; 
} 

Jak widać, wyrażenie lambda jest bardzo przydatny do przekazywania prostych delegatów.

0

Jest to składnia używana dla lambda expresssion.

Poniżej składnia oznacza, wybierz obiekt x i odbierz wartość x.ID.

select x => x.ID