2010-09-20 12 views
6

Les délégués C# ont toujours été difficiles à saisir et j'ai donc été très heureux de tomber sur logicchild's article on The Code Project web site titled "C# Delegates: Step by Step". Il a une façon très succincte d'expliquer les délégués C# et je peux vous le recommander. Cependant, en essayant les exemples, je vois que deux façons d'initialiser un délégué, principalement:Quelle est la manière "correcte" d'initialiser un délégué 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); 

et

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

où la classe de mathématiques est définie comme

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

Alors, quelle est la "bonne" manière et pourquoi?

Répondre

7

Ils sont tous les deux corrects, mais method group conversion, qui est la deuxième option a été ajoutée dans 2.0 (IIRC). C'est à dire. Si vous utilisez une ancienne version du compilateur, vous devez utiliser la première option. Sinon, la frappe supplémentaire est vraiment redondante.

3

J'utilise toujours la première méthode par souci de lisibilité. La deuxième option donne l'impression que math.Sum est une propriété et renvoie un résultat CalculationHandler. Personnellement, je pense que c'est déroutant.

+6

Whoa. Beaucoup de crimes sont commis «pour des raisons de lisibilité», et parmi eux, le plus important est l'écriture de longs codes alambiqués au lieu d'un code clair et concis. C'est le contraire de la lisibilité. –

+0

amusant j'utilise le second pour la lisibilité. Va juste à montrer que la lisibilité est subjective –

+1

@Konrad, long n'est pas automatiquement alambiquée. Et court n'est pas automatiquement lisible. RegEx me vient à l'esprit ... Le fait est que la façon "plus longue" suit de plus près la façon dont tout le reste fonctionne en C#. Le chemin le plus court est potentiellement confus. J'appelle difficilement CalculationHandler sumHandler1 = new CalculationHandler (math.Sum); un crime. – colithium

0

Les deux façons sont OK, la version courte est juste un service de compilation C#. La première façon est plus verbeuse et montre exactement ce qui se passe. Les deux versions produisent le même code IL, qui est en fait proche de la première version.

1

Les deux sont corrects.

La seconde est un raccourci fourni par le compilateur, les deux créent réellement le code du premier.

La première montre plus clairement ce qui se passe réellement, alors que la seconde est moins codée, donc plus lisible (une fois que vous comprenez ce qui se passe réellement).

1

Personnellement, je préfère la deuxième option (conversion de groupe de méthodes). D'un point de vue fonctionnel, je ne me soucie pas du type de délégué, car cela ne me donnera pas d'indications sur ce que fait la méthode assignée au délégué lorsqu'il est invoqué. Le nom de la méthode (au moins devrait) cependant me donner une bonne idée de ce qui va se passer lorsque le délégué est appelé et dans la deuxième option, je n'ai pas besoin de chercher le nom de la méthode.

En note, VS vous donnera la première version si vous utilisez la saisie semi-automatique avec l'enregistrement du gestionnaire d'événements. Resharper utilisera la seconde et marquera une partie du code dans la première version comme redondante.