2011-01-28 10 views
24

starałem się włączyć SSL w moim programie C# klienta i znaleźć następujący kod in this answer:Co oznacza ten kod C# ze "strzałką" i jak się go nazywa?

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

I dodaje kod do mojego programu i to rozwiązało problem, ale zupełnie nie rozumiem, jak dokładnie go Prace.

Lewa część System.Net.ServicePointManager.ServerCertificateValidationCallback to część wywołania zwrotnego, a += modyfikuje to wywołanie zwrotne. Ale co oznacza pozostały konstrukt? Spędziłem 20 minut, szukając przynajmniej informacji, jak właściwie to się nazywa i gdzie mogę znaleźć więcej informacji o tym, jak to przeczytać, ale wszystko na próżno. Przypuszczam, że jest on w jakiś sposób powiązany z LINQ i szukał "strzałki LINQ", ale nie znalazł nic sensownego.

Jak to się nazywa i gdzie można znaleźć (blah,blah,blah)=>{return true;} i gdzie mogę znaleźć więcej informacji na temat takich konstrukcji?

Odpowiedz

57

To jest wyrażenie lambda. Jest to bardzo specjalny anonimowy delegat. Zasadniczo definiujesz metodę, a nie podajesz nazwy. Jego parametry znajdują się po lewej stronie =>, a treść metody znajduje się po prawej stronie =>. W twoim szczególnym przypadku,

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

jest anonimową metodą zdefiniowaną przez wyrażenie lambda. Ta konkretna metoda posiada cztery parametry

object se 
X509Certificate cert 
X509Chain chain 
SslPolicyErrors sslerror 

a ciało metoda jest

return true; 

To tak jakbyś powiedział

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

a następnie

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

Jak to się nazywa i gdzie można znaleźć więcej informacji na temat takich konstrukcji?

Nazywa się to tak samo, jak każda inna metoda jest wywoływana. Na przykład, można to zrobić:

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

Oto jestem określające metodę, która zjada parę int i zwraca int. Ten int uzyskuje się przez dodanie wartości parametrów wejściowych. Można go wywoływać jak każdą inną metodę.

int four = adder(2, 2); 

Oto artykuł na MSDN na lambda expressions i artykuł o lambda operator. Jeśli jesteś naprawdę zainteresowany, nazwa pochodzi od lambda calculus.

+0

Poza składni chcę wiedzieć, jest to rodzaj realizacji (powrót prawdziwej wartości dla wszystkich przypadków) nie prowadzi do błędu bezpieczeństwa? Chodzi mi o to, że powinniśmy przeprowadzić jakąś walidację i ten rodzaj powracania do wszystkich przypadków sprawia, że ​​nasz kod jest podatny na zagrożenia bezpieczeństwa. – VSB

+0

Wygląda na to, że ten rodzaj implementacji jest zagrożeniem bezpieczeństwa i ten przypadek został odnotowany w odpowiedzi na główne pytanie [tutaj] (https://stackoverflow.com/a/1742967/1080355) – VSB

1

Ten fragment nazywa się funkcją anonimową. Buduje anonimową metodę wokół delegata wywołania zwrotnego i zawsze zwraca true.

2
(blah,blah,blah)=>{return true;} 

to wyrażenie lambda. Nie wygląda jak lambda, do którego jesteś przyzwyczajony, ponieważ nie używa żadnych argumentów, które zostaną mu przekazane. Kompilator zmieni tę funkcję lambda w funkcję delegowania, bez konieczności przechodzenia przez długi, irytujący proces tworzenia całej funkcji, która implementuje specyfikację delegata, z której korzysta usługa ServicePointManager.ServerCertificateValidationCallback.

2

Jason wyjaśnia to bardzo dobrze. Oto przykład przy użyciu zdarzenie, które się słucha przy użyciu różnych technik:

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