2010-02-02 14 views
9

Tengo una pregunta simple: ¿cuál es la ventaja de crear instancias de un delegado C# en lugar de solo pasar la referencia de función? Lo que quiero decir es:C# Delegate Instantiation vs. Just Passing the Method Reference

qué hacer:

Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod)); 

Cuando se puede hacer:

Thread t = new Thread(SomeObject.SomeMethod); 

Ambos compilar y trabajar en mi experiencia ... me estoy perdiendo algo?

+0

posible duplicado de [¿Cuál es la diferencia entre la nueva Acción() y una lambda?] (Http://stackoverflow.com/questions/765966/what-is-the-difference-between-new-action-and- a-lambda) – nawfal

Respuesta

6

Siempre que el grupo de métodos SomeObject.SomeMethod tenga un método con retorno tipo void y no tome ningún parámetro, no hay diferencia. Esto es porque ThreadStart se define como delegate que devuelve void y no toma ningún parámetro y, por lo tanto, hay una conversión implícita del grupo de métodos SomeObject.SomeMethod a ThreadStart. Por lo tanto, ambos invocan la sobrecarga Thread(ThreadStart) del constructor Thread.

La sección correspondiente de la especificación de idioma es §6.6 (conversiones de grupo de métodos).

Tengo una pregunta simple: ¿cuál es la ventaja de instanciar un delegado C# en lugar de simplemente pasar la referencia de función?

Por lo tanto, solo una corrección de la terminología aquí. Con

class MyObject { 
    public void SomeMethod() { } 
} 

MyObject someObject = new MyObject(); 

lo denotado por someObject.SomeMethod es un grupo método. Puedes pensarlo ya que el conjunto de métodos sobrecargados puede buscarse usando la notación someObject.SomeMethod.

+1

¿Es 'someObject.SomeMethod()' también un grupo de métodos? –

+1

@John Feminella: No, eso sería una invocación a un método. – jason

+0

Hmm, está bien. ¿Qué ocurre si 'SomeMethod' tiene varias sobrecargas cuya firma coincide con' SomeMethod (...) ', donde' ... 'son parámetros arbitrarios? ¿Es un grupo de métodos entonces, ya que podría referirse a uno de varios métodos y aún no se ha resuelto? –

4

El compilador deducirá que cuando escribió el código más corto, quiso decir el código más largo. No hay diferencia en el efecto final. Si quieres la claridad del constructor completo, puedes ponerlo; si desea la brevedad de solo el grupo de métodos, puede permitir que el compilador deduzca el constructor. Es solo una elección estilística.