web-dev-qa-db-fra.com

Que signifie la syntaxe '=>' en C #?

Je viens juste de comprendre cette syntaxe dans certaines des questions de ce forum, mais Google et tous les autres moteurs de recherche ont tendance à bloquer tout sauf les lettres et les chiffres dans la recherche; il est donc impossible de rechercher "=>".

Alors quelqu'un peut-il me dire ce que c'est et comment il est utilisé? 

66
Wolf5

C'est l'opérateur lambda.

Du n ° 3 au n ° 5, cela n'était utilisé que pour expressions lambda . Il s’agit d’une forme plus courte des méthodes anonymes introduites dans C # 2, mais qui peuvent également être converties en arbres d’expression .

Par exemple:

Func<Person, string> nameProjection = p => p.Name;

est équivalent à:

Func<Person, string> nameProjection = delegate (Person p) { return p.Name; };

Dans les deux cas, vous créez un délégué avec un paramètre Person, en renvoyant le nom de cette personne (sous forme de chaîne).

En C # 6, la même syntaxe est utilisée pour les membres expression-bodied, par exemple.

// Expression-bodied property
public int IsValid => name != null && id != -1;

// Expression-bodied method
public int GetHashCode() => id.GetHashCode();

Voir également:

(Et effectivement beaucoup de questions similaires - essayez les balises lambda _ et expressions-lambda .)

74
Jon Skeet

Cela signifie génial. Par exemple.

x => x + 1

représente une méthode qui prend x en tant que paramètre et retourne son successeur.

button.Click += new EventHandler((sender, e) => methodInfo.Invoke(null, new object[] { sender, e }));

affecte un gestionnaire d'événements à un bouton en appelant une méthode détenue par un MethodInfo.

15
Serhat Ozgel

C'est une autre forme de notation de fonction. Ce qui suit est à peu près équivalent:

// explicit function
int MyFunc(int pParam)
{
   return pParam;
}

// delegate function
Func<int, int> MyFunc = delegate(int pParam) { return pParam; };

// lambda expression
Func<int, int> MyFunc = x => x;

Pensez à une expression lambda qui dit "donnez quelque chose, retournez quelque chose". Dans l'exemple ci-dessus, la fonction x => x dit "étant donné x, retourne x". (Bien que les expressions lambda n'aient pas nécessairement besoin de renvoyer quelque chose, vous pouvez les lire comme "donnant x, faites quelque chose avec x".)

11
Dave Cousineau

voici un exemple simple de msdn

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

Tout ce qui précède le => correspond aux paramètres d'entrée et tout ce qui suit est l'expression. Vous pouvez avoir plusieurs paramètres d'entrée. Les Lambda sont principalement utilisés avec Linq.

9
Steve

Au lieu d'utiliser une méthode anonyme comme celle-ci:

somevar.Find(delegate(int n)
{
   if(n < 10)
      return n;
});

vous écrivez simplement comme ceci:

somevar.Find(n => n < 10);

Il prendra le type de données basé sur la valeur de retour.

6
milot

Le jeton => est pris en charge sous deux formes: en tant qu'opérateur lambda et en tant que séparateur d'un nom de membre et son implémentation dans une définition de corps d'expression.

Opérateur Lambda

Dans les expressions lambda, l'opérateur lambda => sépare les variables d'entrée du côté gauche du corps lambda du côté droit.

L'exemple suivant utilise la fonctionnalité LINQ avec la syntaxe de méthode pour illustrer l'utilisation des expressions lambda:

string[] words = { "bot", "Apple", "apricot" };
int minimalLength = words
  .Where(w => w.StartsWith("a"))
  .Min(w => w.Length);
Console.WriteLine(minimalLength);   // output: 5

Définition du corps d'expression

Une définition de corps d'expression a la syntaxe générale suivante:

member => expression;

où expression est une expression valide. Notez que expression ne peut être une expression que si le type de retour du membre est void ou si le membre est un constructeur, un finaliseur ou un accesseur de jeu de propriétés.

L'exemple suivant montre une définition de corps d'expression pour une méthode Person.ToString:

public override string ToString() => $"{fname} {lname}".Trim();

C'est une version abrégée de la définition de méthode suivante:

public override string ToString()
{
   return $"{fname} {lname}".Trim();
}
0
user734862

Cela signifie fondamentalement "va dans", comme un paramètre

MyObjectReference => MyObjectReference.DoSomething()

Habituellement, vous les utilisez pour transmettre des fonctions à des méthodes en tant que paramètres ou dans des instructions LINQ.

MyCollection.Where(myobj => myobj.Age>10)

Par exemple.

0
qui

Cela fait partie de la syntaxe d'une expression lambda. Une expression lambda est essentiellement une forme abrégée d'un délégué ou d'une méthode anonyme. Pour illustrer, supposons que j'ai un tableau de chaînes correspondant aux lettres de l'alphabet. Je pouvais choisir les membres de ce tableau contenant des valeurs supérieures à "E" avec l'expression LINQ suivante:

var someLetters = alphabet.Where (l => l> "E");

La partie de l'expression lambda située à gauche du "=>" identifie le nom de la variable pour le test (définie sur les membres individuels de l'alphabet) et la partie de l'expression lambda située à droite du ""> identifie le traitement. Dans ce cas, le traitement produit une valeur booléenne que la logique Where utilise pour déterminer si chaque membre de l'alphabet est transmis au tableau someLetters.

0
JonStonecash