Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Operator wyrażenia lambda (
Token => jest obsługiwany w dwóch formach: jako operator lambda i jako separator nazwy członka oraz implementacji członka w definicji ciała wyrażenia.
Dokumentacja języka C# zawiera ostatnio wydaną wersję języka C#. Zawiera również początkową dokumentację dla funkcjonalności w publicznych wersjach testowych nadchodzącego wydania języka.
Dokumentacja identyfikuje dowolną funkcję po raz pierwszy wprowadzoną w ostatnich trzech wersjach języka lub w bieżącej publicznej wersji zapoznawczej.
Wskazówka
Aby dowiedzieć się, kiedy funkcja została po raz pierwszy wprowadzona w języku C#, zapoznaj się z artykułem dotyczącym historii wersji języka C#.
Operator lambda
W wyrażeniach lambda operator => lambda oddziela parametry wejściowe po lewej stronie od ciała wyrażenia lambda po prawej stronie.
W poniższym przykładzie użyto funkcji LINQ ze składnią metody, aby zademonstrować użycie wyrażeń lambda:
string[] words = { "bot", "apple", "apricot" };
int minimalLength = words
.Where(w => w.StartsWith("a"))
.Min(w => w.Length);
Console.WriteLine(minimalLength); // output: 5
int[] numbers = { 4, 7, 10 };
int product = numbers.Aggregate(1, (interim, next) => interim * next);
Console.WriteLine(product); // output: 280
Parametry wejściowe wyrażenia lambda są silnie typizowane w czasie kompilacji. Gdy kompilator wywnioskuje typy parametrów wejściowych, na przykład w poprzednim przykładzie, można pominąć deklaracje typów. Jeśli musisz określić typ parametrów wejściowych, musisz określić typ dla każdego parametru, jak pokazano w poniższym przykładzie:
int[] numbers = { 4, 7, 10 };
int product = numbers.Aggregate(1, (int interim, int next) => interim * next);
Console.WriteLine(product); // output: 280
W poniższym przykładzie pokazano, jak zdefiniować wyrażenie lambda bez parametrów wejściowych:
Func<string> greet = () => "Hello, World!";
Console.WriteLine(greet());
Aby uzyskać więcej informacji, zobacz Wyrażenia lambda.
Definicja treści wyrażenia
Definicja treści wyrażenia używa następującej składni ogólnej:
member => expression;
W przypadku elementu członkowskiego, który zwraca wartość, wynik wyrażenia musi być niejawnie konwertowany na typ zwracany elementu członkowskiego.
void W przypadku elementu członkowskiego, konstruktora, finalizatora lub setaddinit, lub remove metody dostępu treść musi być wyrażeniem instrukcji. Wyrażenie instrukcji może być przypisaniem, wywołaniem metody, tworzeniem obiektu, operacją przyrostową lub dekrementacją albo await wyrażeniem. Jego wynik, jeśli istnieje, zostanie odrzucony.
Poniższy przykład pokazuje definicję korpusu wyrażenia dla metody Person.ToString.
public override string ToString() => $"{fname} {lname}".Trim();
Jest to skrócona wersja następującej definicji metody:
public override string ToString()
{
return $"{fname} {lname}".Trim();
}
Dla następujących elementów członkowskich można użyć definicji treści wyrażeń:
-
Metody i funkcje lokalne: Element członkowski, który zwraca wartość, ma postać
T M() => expression;. Elementvoidczłonkowski ma formularzvoid M() => statementExpression;. Aby uzyskać więcej informacji, zobacz Metody i funkcje lokalne. -
Operatory: Operator ma postać
public static T operator +(T left, T right) => expression;. Aby uzyskać więcej informacji, zobacz Przeciążenie operatora. -
Właściwości i indeksatory: Właściwość lub indeksator tylko do odczytu ma formularz
T P => expression;lubT this[int i] => expression;. Można również użyć treści wyrażeń dla poszczególnych metod dostępu. Akcesoriumgetma postaćget => expression;. Elementsetlubinitakcesor ma postaćset => statementExpression;lubinit => statementExpression;. Aby uzyskać więcej informacji, zobacz Właściwości i indeksatory. -
Konstruktory i finalizatory: Te elementy członkowskie mają formularz
C() => statementExpression;lub~C() => statementExpression;. Aby uzyskać więcej informacji, zobacz Konstruktory i finalizatory. -
Akcesory zdarzeń: Obiekt
addlubremoveakcesor ma postaćadd => statementExpression;lubremove => statementExpression;. Aby uzyskać więcej informacji, zobacz Events.
Przeciążenie operatora
Nie można przeciążyć => operatora.
Specyfikacja języka C#
Aby uzyskać więcej informacji na temat operatora lambda, zobacz sekcję Anonimowe wyrażenia funkcjispecyfikacji języka C#.