it-swarm.com.de

Was bedeutet diese C # -Code mit einem „Pfeil“ und wie heißt es?

Ich habe versucht, SSL in meinem C # -Client-Programm zu aktivieren und habe den folgenden Code gefunden in dieser Antwort :

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

Ich habe den Code zu meinem Programm hinzugefügt und es hat das Problem gelöst, aber ich verstehe überhaupt nicht, wie genau es funktioniert.

Der linke Teil System.Net.ServicePointManager.ServerCertificateValidationCallback ist ein Rückruf und += modifiziert diesen Rückruf. Aber was bedeutet das verbleibende Konstrukt? Ich habe 20 Minuten lang gesucht, um zumindest herauszufinden, wie es richtig heißt und wo ich weitere Informationen dazu finden kann, aber alles umsonst. Ich nehme an, es hängt irgendwie mit LINQ zusammen und hat nach "LINQ arrow" gesucht, aber nichts Vernünftiges gefunden.

Wie heißt dieses (blah,blah,blah)=>{return true;}-Konstrukt und wo finde ich weitere Informationen zu solchen Konstrukten?

27
sharptooth

Das ist ein Lambda-Ausdruck. Es ist ein ganz besonderer anonymer Delegierter. Grundsätzlich definieren Sie eine Methode und geben keinen Namen an. Seine Parameter befinden sich links von => und der Methodenkörper befindet sich rechts von =>. In Ihrem speziellen Fall

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

ist eine anonyme Methode, die durch einen Lambda-Ausdruck definiert wird. Diese bestimmte Methode hat vier Parameter

object se
X509Certificate cert
X509Chain chain
SslPolicyErrors sslerror

und der Methodenkörper ist

return true;

Es ist, als hätten Sie gesagt

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

und dann

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

Wie heißt das (blah,blah,blah)=>{return true;}-Konstrukt und wo finde ich weitere Informationen zu solchen Konstrukten?

Es wird auf dieselbe Weise wie jede andere Methode aufgerufen. Zum Beispiel können Sie dies tun:

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

Hier definiere ich eine Methode, die ein Paar von intisst und einen intzurückgibt. Das interhält man durch Addition der Werte der Eingabeparameter. Es kann wie jede andere Methode aufgerufen werden.

int four = adder(2, 2); 

Hier ist ein Artikel über MSDN über Lambda-Ausdrücke und ein Artikel über den Lambda-Operator . Wenn Sie wirklich interessiert sind, kommt der Name aus Lambda-Kalkül .

68
jason
6
Daniel A. White

Der Vollständigkeit halber (für Suchergebnisse usw.): In neueren Versionen von C # (seit 6.0) wurde die =>-Syntax von nur Lambdas für Delegaten und Ausdrucksbäume auf expression-body-Elemente erweitert. Dies bedeutet, dass eine Reihe einfacher Elemente wie Eigenschaften, Methoden usw. als Ausdruckskörper implementiert werden können. zum Beispiel:

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

kann geschrieben werden:

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

Jason erklärt es sehr gut. Hier ein Beispiel, bei dem ein Ereignis verwendet wird, das mit verschiedenen Techniken abgehört wird:

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;} 

ist ein Lambda-Ausdruck. Es sieht nicht aus wie die Lambdas, die Sie gewohnt sind, weil es keine Argumente verwendet, die an sie übergeben werden. Der Compiler verwandelt dieses Lambda in eine Delegatfunktion für Sie, ohne dass Sie den langwierigen Prozess der Erstellung einer ganzen Funktion durchlaufen müssen, die die von ServicePointManager.ServerCertificateValidationCallback verwendete Delegatspezifikation implementiert.

2
Dave Markle

Dieses Snippet wird anonyme Funktion genannt. Es baut eine anonyme Methode um den Callback-Delegaten auf und gibt immer true zurück. 

1
MacX

Der =>- Operator steht für einen Lambda-Ausdruck.

Aber für diejenigen von Ihnen, die die Frage heute besuchen, könnte der Pfeil als Abkürzung für einen Immobilien-Getter ein anderer Anwendungsfall sein. Diese Funktion wurde in C # 6 eingeführt. Statt zu schreiben

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

sie können folgendes Snippet verwenden:

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

oder noch kürzer:

public string Foo => this.bar;
0
WoIIe