2010-09-20 25 views
6

C# delegados siempre han sido difíciles para mí de entender y por lo que era muy feliz a tropezar con logicchild's article on The Code Project web site titled "C# Delegates: Step by Step". Él tiene una manera muy sucinta de explicar a los delegados de C# y puedo recomendarlo. Sin embargo, en probar los ejemplos, veo que son dos formas de inicializar un delegado, principalmente:¿Cuál es la forma "correcta" de inicializar un delegado de C#?

//create a new instance of the delegate class 
    CalculationHandler sumHandler1 = new CalculationHandler(math.Sum); 
    //invoke the delegate 
    int result = sumHandler1(8, 9); 
    Console.WriteLine("Result 1 is: " + result); 

y

CalculationHandler sumHandler2 = math.Sum; 
    //invoke the delegate 
    int result = sumHandler2(8, 9); 
    Console.WriteLine("Result 2 is: " + result); 

donde la clase de matemáticas se define como

public class Math 
{ 
    public int Sum(int x, int y) 
    { 
     return x + y; 
    } 
} 

Entonces, ¿cuál es la forma "correcta" y por qué?

Respuesta

7

ambos son correctos, pero method group conversion, que es se añadió la segunda opción en 2,0 (IIRC). Es decir. si está utilizando una versión anterior del compilador, debe usar la primera opción. De lo contrario, el tipeo extra es realmente redundante.

3

siempre uso el primer método para facilitar la lectura. La segunda opción hace que parezca que math.Sum es una propiedad y devuelve un resultado que es un CalculationHandler. Personalmente, creo que eso es confuso.

+6

Whoa. Se cometen muchos crímenes "por el bien de la legibilidad", y uno de los principales es escribir código largo y complicado en lugar de un código claro y conciso. Eso es lo opuesto a la legibilidad. –

+0

diversión uso el segundo para facilitar la lectura. Solo sirve para mostrar que la legibilidad es subjetiva –

+1

@Konrad, long no iguala automáticamente la complicada. Y corto no es automáticamente legible. RegEx viene a la mente ... El hecho es que la forma "más larga" sigue más de cerca la forma en que todo lo demás funciona en C#. El camino más corto es potencialmente confuso. Apenas llamaría a CalculationHandler sumHandler1 = new CalculationHandler (math.Sum); un crimen. – colithium

0

Ambas formas están bien, versión corta es simplemente C# compilador servicio. La primera forma es más detallada y muestra exactamente lo que sucede. Ambas versiones producen el mismo código IL, que en realidad está cerca de la primera versión.

1

ambos son correctos.

El segundo es un acceso directo proporcionado por el compilador, tanto crea realmente el código de la primera.

El primero muestra más claramente lo que está sucediendo realmente, mientras que el segundo es menos código, así que es más fácil de leer (una vez que entienda lo que realmente está sucediendo).

1

Personnaly I preferre la segunda opción (conversión grupo método). Desde un punto de vista funcional, no me importa el tipo de delegado, ya que eso no me da ninguna pista de lo que está haciendo el método asignado al delegado cuando se invoca. El nombre del método (al menos debería) sin embargo me da una buena idea de lo que sucederá cuando se invoque al delegado y en la segunda opción no tengo que buscar el nombre del método.

Como nota al margen VS le dará la primera versión si se utiliza autocompletar con el registro de controlador de eventos. Resharper usará el segundo y marcará parte del código en la primera versión como redundante.

Cuestiones relacionadas