2009-08-01 18 views
9

He estado leyendo a través del código fuente para Moq y me encontré con la siguiente prueba de unidad:¿Qué significa() => en C#?

Assert.Throws<ArgumentOutOfRangeException>(() => Times.AtLeast(0)); 

Y para la vida de mí, no puedo recordar lo que() => hace realidad. Creo que tiene algo que ver con métodos anónimos o lambdas. Y estoy seguro de que sabe lo que hace, simplemente no puedo recordar en este momento ....

Y para empeorar las cosas .... google isn't being much help y neither is stackoverflow

Puede alguien dar una rápida responder a una pregunta bastante noobish?

+0

me recuerda cuando yo estaba buscando información sobre "* =" en SQL ... no es el más eng búsqueda ine amigable operador ... –

+0

si entiendo esto correctamente, significa que si Times.AtLeast (0) es falso, entonces se produce una excepción. ¿Estoy en lo correcto? ¿Funcionará esto solo en el modo "depuración"? –

Respuesta

11

() => es una expresión lambda nullary. representa una función anónima que se pasa a assert.Throws, y se llama en algún lugar dentro de esa función.

void DoThisTwice(Action a) { 
    a(); 
    a(); 
} 
Action printHello =() => Console.Write("Hello "); 
DoThisTwice(printHello); 

// prints "Hello Hello " 
+1

Entonces, básicamente, el código de prueba de la unidad está creando un método anónimo que llama a un método que luego se ejecuta con el método Throws que maneja la excepción lanzada y afirma que se lanzó la excepción correcta. – mezoid

+0

sí. .................... – Jimmy

12

Buscar StackOverflow para "lambda".

Específicamente:

() => Console.WriteLine("Hi!"); 

Eso significa "un método que no tiene argumentos y devuelve void, y cuando usted lo llama, se escribe el mensaje en la consola."

Se pueden almacenar en una variable de Acción:

Action a =() => Console.WriteLine("Hi!"); 

Y entonces se le puede llamar:

a(); 
+0

¿Alguna razón para el voto a favor o la eliminación del voto? –

+0

No fui yo, pero probablemente porque "Search Stack Overflow for lambda" no es muy útil teniendo en cuenta que OP reconoció que sabía que tenía algo que ver con lambdas. +1 de mí, sin embargo. –

+0

Alguien probablemente votó negativamente antes de expandir su respuesta inicial. En cuanto a su respuesta ahora, sin embargo, definitivamente es muy útil. – mezoid

0

no lo hago programa en C#, pero googlear "C# Lambda" proporcionado this link ¡eso responde tu pregunta!

2

Esa es la definición de la función lambda (anonymous). Básicamente, es una forma de definir una función en línea, ya que Assert.Throws toma una función como argumento e intenta ejecutarla (y luego verifica que arroje una cierta excepción).

Básicamente, el fragmento que tiene allí es una prueba de unidad que asegura que Times.AtLeast (0) arroje una excepción ArgumentOutOfRangeException. La función lambda es necesaria (en lugar de simplemente intentar llamar a la función Times.AtLeast directamente desde Assert.Throws) para pasar el argumento adecuado para la prueba - en este caso 0.

MSDN artículo de KB sobre el tema aquí : http://msdn.microsoft.com/en-us/library/bb882516.aspx

4
() => Times.AtLeast(0) 

() indica que la función no tiene parámetros lambda o valor de retorno.

=> indica que un bloque de código debe seguir.

Times.AtLeast (0) llama al menos método estático de la clase veces con un parámetro de 0.

9

Es una expresión lambda.La sintaxis más común es usar un parámetro, por lo que no hay paréntesis necesarios alrededor de él:

n => Times.AtLeast(n) 

Si el número de parámetros es algo más que una, se necesitan paréntesis:

(n, m) => Times.AtLeast(n + m) 

Cuando hay parámetros cero, se obtiene la sintaxis algo torpe con los paréntesis alrededor de la lista de parámetros vacía:

() => Times.AtLeast(0) 
+0

ahhh ... ¡eso tiene mucho sentido! ¡Gracias! – mezoid