2010-12-20 13 views
7

Descubrí una nueva sintaxis de C# y no entiendo lo que significa. Aquí está el código relacionado con la sintaxis:¿Por qué puedo usar una expresión lambda en lugar de un delegado de devolución de llamada?

1)

BeginInvoke(new Action(() => 
    { 
     PopulateUI(ds); 
    })); 

2)

private void OnFormLoad() 
{ 
    ThreadPool.QueueUserWorkItem(() => GetSqlData()); 
} 

¿Cuál es el significado de new Action() y cuál es el significado del símbolo =>?

La sintaxis de ThreadPool.QueueUserWorkItem era ThreadPool.QueueUserWorkItem(new WaitCallback(PrintOut), "Hello"); pero aquí muestra ThreadPool.QueueUserWorkItem(() => GetSqlData());, entonces, ¿cómo funciona? ¿Por qué falta WaitCallback? Por favor explique en detalle.

Muchas gracias.

+8

*() => some_code * es una expresión lambda y es solo un atajo para escribir delegados anónimos. Creo que tu confusión es causada por demasiadas formas de lograr lo mismo. –

+0

@Pauli Østerø: Muy bien dicho :) – BoltClock

+0

'ThreadPool.QueueUserWorkItem ((= = GetSqlData());' no se compila en mi aplicación de prueba. ¿Qué versión de .NET Framework utiliza su proyecto (o al menos, qué versión de VS)? –

Respuesta

6

Tenga una mirada en

Action Delegate

Encapsula un método que tiene un único parámetro de y no devuelve un valor . Puede usar el delegado Acción para pasar un método como un parámetro sin declarar explícitamente un delegado personalizado.

y

y Lambda Expressions (C# Programming Guide)

Una expresión lambda es una función anónima que pueden contener expresiones y declaraciones, y se puede utilizar para crear delegados o árbol de expresión tipos.

Todas las expresiones lambda utilizan el operador lambda =>, que se lee como "va a". El lado izquierdo del operador lambda especifica los parámetros de entrada (si corresponde) y el lado derecho contiene la expresión o el bloque de declaración . La expresión lambda x => x * x se lee "x va a x veces x".

4

Se conocen como lambda expressions, que no son muy diferentes de los delegados en C#.

El () vacío significa que no hay argumentos, y lo que está entre los (opcional) {} son los cuerpos de expresiones lambda. El operador => simplemente asocia ambas expresiones para hacer una expresión lambda. Como un lado, se encuentran comúnmente en el código LINQ.

No hay nada especial en new Action(), solo que es un delegate que puede asignar una expresión lambda a sí mismo.

En cuanto a ThreadPool.QueueUserWorkItem(), el argumento WaitCallback es un delegado.Puede pasar el nombre de un delegado designado como argumento, pasar un objeto anónimo delegate o escribir una expresión lambda para este delegate anónimo (en su caso es () => GetSqlData()).

+0

@Gabe: Vaya, lo he editado ahora. – BoltClock

5

Como han dicho otros, es un lambda, que es básicamente una (sin nombre) local de la función anónima.

Esto podría hacer un poco más de sentido si nos fijamos en algún código similar que no utiliza lambdas:

// With a lambda 
private void OnFormLoad() 
{ 
    ThreadPool.QueueUserWorkItem(() => GetSqlData()); 
} 

// Without a lambda 
private void OnFormLoad() 
{ 
    ThreadPool.QueueUserWorkItem(ExecuteGetSqlData); 
} 

private void ExecuteGetSqlData() 
{ 
    // If GetSqlData returns something, change this to "return GetSqlData();" 
    GetSqlData(); 
} 

En cuanto al otro código, normalmente no debería tener que hacer new Action. El problema es que el método BeginInvoke toma un Delegate, que es una especie de vieja escuela, y rompe la forma en que funciona el código más nuevo.

Con el código más reciente (que lleva algo como Action, o un tipo específico de delegado, como WaitCallback), o bien escribe un lambda, o simplemente da el nombre de una función dentro de su clase. El código de ejemplo que escribí arriba demuestra ambos.

También tenga en cuenta que si ve algo como: (Action) (() => Blah()), es prácticamente lo mismo que new Action(() => Blah()).

+0

gracias por su ayuda;). – Thomas

Cuestiones relacionadas