web-dev-qa-db-fra.com

Que signifie ce code C # avec une "flèche" et comment s'appelle-t-il?

J'essayais d'activer SSL dans mon programme client C # et j'ai trouvé le code suivant dans cette réponse :

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
    (se, cert, chain, sslerror) =>
    {
        return true;
    };

J'ai ajouté le code à mon programme et cela a résolu le problème, mais je ne comprends absolument pas comment cela fonctionne.

La partie gauche System.Net.ServicePointManager.ServerCertificateValidationCallback correspond à un rappel et += modifie ce rappel. Mais que signifie la construction restante? J'ai passé 20 minutes à chercher au moins comment l'appel est correctement appelé et où je peux trouver plus d'informations sur la façon de le lire, mais en vain. Je suppose que c'est en quelque sorte lié à LINQ et à la recherche de "flèche LINQ", mais n'a rien trouvé raisonnable.

Comment cette construction (blah,blah,blah)=>{return true;} est-elle appelée et où puis-je trouver plus d'informations sur ces constructions?

27
sharptooth

C'est une expression lambda. C'est un délégué anonyme très spécial. Fondamentalement, vous définissez une méthode et ne donnez pas de nom. Ses paramètres sont à gauche du => et le corps de la méthode est à droite du =>. Dans votre cas particulier,

(se, cert, chain, sslerror) => { return true; };

est une méthode anonyme définie par une expression lambda. Cette méthode particulière a quatre paramètres

object se
X509Certificate cert
X509Chain chain
SslPolicyErrors sslerror

et le corps de la méthode est

return true;

C'est comme si tu avais dit

class ServerCertificateValidation {
    public bool OnRemoteCertificateValidation(
        object se,
        X509Certificate cert,
        X509Chain chain,
        SslPolicyErrors sslerror
    ) {
        return true;
    }
}

et alors

var validation = new ServerCertificateValidation();
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
    validation.OnRemoteCertificateValidation;

Comment cette construction (blah,blah,blah)=>{return true;} est-elle appelée et où puis-je trouver plus d'informations sur ces constructions?

Cela s'appelle de la même manière que n'importe quelle autre méthode. Par exemple, vous pouvez faire ceci:

Func<int, int, int> adder = (m, n) => m + n;

Ici, je définis une méthode qui mange une paire de int et retourne une int. Cette int est obtenue en ajoutant les valeurs des paramètres d'entrée. Il peut être invoqué comme n'importe quelle autre méthode.

int four = adder(2, 2); 

Voici un article sur MSDN sur expressions lambda et un article sur l'opérateur lambda . Si vous êtes vraiment intéressé, le nom vient de lambda calculus .

68
jason
6
Daniel A. White

Pour être complet (pour les résultats de recherche, etc.): dans les versions plus récentes de C # (depuis la version 6.0), la syntaxe => a été étendue de lambdas uniquement pour les délégués et les arbres d’expression, à couvrir les membres avec des expressions Cela signifie qu'une gamme de membres simples tels que propriétés, méthodes, etc. peut être implémentée en tant que corps d'expression; par exemple:

public int Foo { get { return innerObj.SomeProp; } }
public void Bar() { Write("Thing"); }

peut être écrit:

public int Foo => innerObj.SomeProp;
public void Bar() => Write("Thing");
4
Marc Gravell

Jason l'explique très bien. Voici un exemple d'utilisation d'un événement écouté à l'aide de différentes techniques:

using System;

namespace Events
{
   class Program
    {
        static void Main(string[] args)
        {
            Events e = new Events();
            e.FireEvents();
            Console.ReadLine();
        }
    }

    public class Events
    {
        private event EventHandler<EventArgs> EventTest;

        public Events()
        {
            EventTest += new EventHandler<EventArgs>(function);

            EventTest += delegate
            {
                Console.WriteLine("written by an anonymous method.");
            };

            EventTest += (o, e) =>
            {
                Console.WriteLine("written by a lambda expression");
            };
        }

        private void function(object sender, EventArgs e)
        {
            Console.WriteLine("written by a function.");
        }

        public void FireEvents()
        {
            if (EventTest != null)
                EventTest(this, new EventArgs()); 
        }
    }
}
2
miyamotogL
(blah,blah,blah)=>{return true;} 

est une expression lambda. Cela ne ressemble pas aux lambdas auxquels vous êtes habitué, car il n’utilise aucun argument qui lui est transmis. Le compilateur transformera ce lambda en une fonction de délégué pour vous, sans que vous ayez à passer par le long processus fastidieux de création d’une fonction complète qui implémente la spécification de délégué utilisée par ServicePointManager.ServerCertificateValidationCallback.

2
Dave Markle

Cet extrait s'appelle fonction anonyme. Il crée une méthode anonyme autour du délégué de rappel et renvoie toujours true. 

1
MacX

Le =>- Operator représente une expression lambda.

Mais pour ceux d’entre vous qui visitent la question de nos jours, un autre cas d’utilisation pourrait être la flèche en abrégé pour un acquéreur de propriété. Cette fonctionnalité a été introduite en C # 6. Donc, au lieu d’écrire

public string Foo
{
    get
    {
        return this.bar;
    }
}

vous pouvez utiliser l'extrait suivant:

public string Foo 
{
    get => this.bar;
}

ou même plus court:

public string Foo => this.bar;
0
WoIIe