2011-01-28 10 views
24

Stavo cercando di abilitare SSL nel mio programma C# client e hanno trovato il seguente codice in this answer:Cosa significa questo codice C# con una "freccia" e come si chiama?

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

ho aggiunto il codice per il mio programma ed è risolto il problema, ma ho completamente Non capisco come esattamente lavori.

La parte sinistra System.Net.ServicePointManager.ServerCertificateValidationCallback è una richiamata e += modifica tale richiamata. Ma cosa significa il restante costrutto? Ho passato 20 minuti alla ricerca per trovare almeno come è chiamato correttamente e dove posso trovare più informazioni su come leggerlo, ma tutto invano. Suppongo che sia in qualche modo correlato a LINQ e cercato "LINQ arrow", ma non ha trovato nulla di ragionevole.

Come viene chiamato il costrutto (blah,blah,blah)=>{return true;} e dove posso trovare maggiori informazioni su tali costrutti?

risposta

57

Questa è un'espressione lambda. È un delegato anonimo molto speciale. Fondamentalmente stai definendo un metodo e non dando un nome. I suoi parametri si trovano a sinistra di => e il corpo del metodo si trova a destra di =>. Nel tuo caso particolare,

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

è un metodo anonimo definito da un'espressione lambda. Questo particolare metodo ha quattro parametri

object se 
X509Certificate cert 
X509Chain chain 
SslPolicyErrors sslerror 

ed il corpo del metodo è

return true; 

E 'come se avessi detto

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

e poi

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

Come viene chiamato il costrutto e dove posso trovare maggiori informazioni su tali costrutti?

Si chiama allo stesso modo in cui viene chiamato qualsiasi altro metodo. Ad esempio, si può fare questo:

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

Qui sto definizione di un metodo che mangia un paio di int e restituisce un int. Il valore int si ottiene aggiungendo i valori dei parametri di input. Può essere invocato come qualsiasi altro metodo.

int four = adder(2, 2); 

Ecco un articolo su MSDN su lambda expressions e un articolo sul lambda operator. Se sei veramente interessato, il nome deriva da lambda calculus.

+0

Oltre della sintassi che voglio sapere è questo tipo di implementazione (restituendo vero valore per tutti i casi) non porta ad un bug di sicurezza? Voglio dire che dovremmo fare qualche convalida e questo tipo di ritorno vero per tutti i casi rende il nostro codice soggetto a rischi per la sicurezza. – VSB

+0

Sembra che questo tipo di implementazione sia un rischio per la sicurezza e questo caso è annotato nella risposta alla domanda principale [qui sopra] (https://stackoverflow.com/a/1742967/1080355) – VSB

1

Questo snippet si chiama funzione anonima. Costruisce un metodo anonimo attorno al delegato di callback e restituisce sempre true.

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

è un'espressione lambda. Non assomiglia ai lambda ai quali sei abituato perché non usa alcun argomento che gli venga passato. Il compilatore trasformerà questo lambda in una funzione delegata per te, senza che tu debba affrontare il lungo e fastidioso processo di creazione di un'intera funzione che implementa le specifiche dei delegati utilizzate da ServicePointManager.ServerCertificateValidationCallback.

2

Jason lo spiega molto bene. Ecco un esempio utilizzando un evento che viene ascoltato utilizzando diverse tecniche:

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