2011-01-28 7 views
24

yo estaba tratando de habilitar SSL en mi programa en C# cliente y encontró el siguiente código in this answer:¿Qué significa este código C# con una "flecha" y cómo se llama?

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

he añadido el código a mi programa y se solucionó el problema, pero estoy totalmente de no entiendo cómo es exactamente lo trabajos.

La parte izquierda System.Net.ServicePointManager.ServerCertificateValidationCallback es una devolución de llamada y += modifica esa devolución de llamada. Pero, ¿qué significa la construcción restante? Pasé 20 minutos buscando, al menos, cómo se llama correctamente y dónde puedo encontrar más información sobre cómo leer eso, pero todo fue en vano. Supongo que de alguna manera está relacionado con LINQ y buscó "LINQ arrow", pero no encontró nada razonable.

¿Cómo se llama esa construcción (blah,blah,blah)=>{return true;} y dónde puedo encontrar más información sobre tales construcciones?

Respuesta

57

Esa es una expresión lambda. Es un delegado anónimo muy especial. Básicamente, estás definiendo un método y no dando un nombre. Sus parámetros están a la izquierda del => y el cuerpo del método está a la derecha del =>. En su caso particular,

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

es un método anónimo definido por una expresión lambda. Este método en particular tiene cuatro parámetros

object se 
X509Certificate cert 
X509Chain chain 
SslPolicyErrors sslerror 

y el cuerpo del método es

return true; 

Es como si hubiera dicho

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

y luego

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

¿Cómo se llama esa construcción (blah,blah,blah)=>{return true;} y dónde puedo encontrar más información sobre tales construcciones?

Se llama de la misma manera que se llama a cualquier otro método. Por ejemplo, usted puede hacer esto:

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

Aquí estoy definiendo un método que come un par de int y devuelve un int. Ese int se obtiene sumando los valores de los parámetros de entrada. Se puede invocar como cualquier otro método.

int four = adder(2, 2); 

He aquí un artículo de MSDN en lambda expressions y un artículo sobre la lambda operator. Si realmente está interesado, el nombre proviene del lambda calculus.

+0

Además de la sintaxis que quiero saber es que este tipo de aplicación (volviendo verdadero valor para todos los casos) no conduce a un fallo de seguridad? Quiero decir que deberíamos hacer algo de validación y este tipo de devolución verdadera para todos los casos hace que nuestro código sea propenso a riesgos de seguridad. – VSB

+0

Parece que este tipo de implementación es un riesgo de seguridad y este caso se menciona en la respuesta a la pregunta principal [aquí] (https://stackoverflow.com/a/1742967/1080355) – VSB

1

Este fragmento se denomina función anónima. Construye un método anónimo alrededor del delegado de devolución de llamada y siempre devuelve verdadero.

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

es una expresión lambda. No se parece a las lambdas a las que estás acostumbrado porque no usa ningún argumento que se le pase. El compilador convertirá esta lambda en una función de delegado para usted, sin tener que pasar por el largo e irritante proceso de creación de una función completa que implementa la especificación de delegado que utiliza ServicePointManager.ServerCertificateValidationCallback.

2

Jason lo explica muy bien. Aquí hay un ejemplo usando un evento que se escucha el uso de diferentes técnicas:

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