2010-09-20 28 views
6

I delegati di C# sono sempre stati difficili da comprendere e quindi sono stato molto felice di imbattermi in logicchild's article on The Code Project web site titled "C# Delegates: Step by Step". Ha un modo molto sintetico di spiegare i delegati di C# e posso consigliarvelo. Tuttavia, a provare gli esempi, vedo che sono due modi per inizializzare un delegato, principalmente:Qual è il modo "corretto" per inizializzare un delegato 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); 

e

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

dove la classe di matematica è definita come

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

Quindi qual è il modo "corretto" e perché?

risposta

7

Sono entrambi corretti, ma method group conversion, che è la seconda opzione è stata aggiunta in 2.0 (IIRC). Cioè se stai usando una vecchia versione del compilatore devi usare la prima opzione. In caso contrario, la digitazione aggiuntiva è davvero ridondante.

3

Uso sempre il primo metodo per motivi di leggibilità. La seconda opzione fa apparire che math.Sum è una proprietà e restituisce un risultato che è un CalculationHandler. Personalmente, penso che sia confuso.

+6

Whoa. Un sacco di crimini sono commessi "Per motivi di leggibilità" e tra loro spicca la scrittura di un codice lungo e contorto anziché di un codice chiaro e conciso. Questo è l'opposto della leggibilità. –

+0

divertente uso il secondo per la leggibilità. Basta dimostrare che la leggibilità è soggettiva –

+1

@Konrad, long non è automaticamente uguale a contorto. E breve non automaticamente uguale leggibile. RegEx viene in mente ... Il fatto è che il modo "più lungo" segue più da vicino il modo in cui tutto il resto funziona in C#. La via più breve è potenzialmente confusa. Chiamerei a malapena CalculationHandler sumHandler1 = new CalculationHandler (math.Sum); un crimine. – colithium

0

Entrambi i metodi sono OK, la versione breve è solo il servizio di compilazione C#. Il primo modo è più dettagliato e mostra esattamente cosa succede. Entrambe le versioni producono lo stesso codice IL, che in realtà è vicino alla prima versione.

1

Entrambi sono corretti.

Il secondo è un collegamento fornito dal compilatore, entrambi in realtà creano il codice del primo.

Il primo mostra più chiaramente cosa sta realmente accadendo, mentre il secondo è meno codice, quindi è più facile da leggere (una volta capito cosa sta realmente accadendo).

1

Personnaly Preferisco la seconda opzione (conversione del gruppo di metodi). Da un punto di vista funzionale non mi interessa il tipo di delegato, dal momento che ciò non mi darà alcun suggerimento su ciò che il metodo assegnato al delegato sta facendo quando invocato. Il nome del metodo sarà (almeno dovrebbe) comunque mi dia una buona idea di cosa succederà quando viene richiamato il delegato e nella seconda opzione non devo cercare il nome del metodo.

Come nota a margine VS fornirà la prima versione se si utilizza il completamento automatico con la registrazione del gestore eventi. Il resharper utilizzerà la seconda e segnerà parte del codice nella prima versione come ridondante.

Problemi correlati