2013-07-03 15 views
8

Nell'assegnare i gestori di eventi a qualcosa come un contesto MenuItem, per esempio, ci sono due sintassi accettabili:Esiste un vantaggio per l'uso esplicito della dichiarazione "new EventHandler"?

MenuItem item = new MenuItem("Open Image", btnOpenImage_Click); 

... e ...

MenuItem item = new MenuItem("Open Image", new EventHandler(btnOpenImage_Click)); 

Noto anche che gli stessi appare per applicare a questo:

listView.ItemClick += listView_ItemClick; 

... e ...

listView.ItemClick += new ItemClickEventHandler(listView_ItemClick); 

C'è qualche vantaggio particolare per il secondo (esplicito) rispetto al primo? O è più una questione stilistica?

risposta

9

In C# 1.0 non c'era altra scelta che definire esplicitamente il tipo di delegato e la destinazione.

Dal momento che C# 2.0 il compilatore consente di esprimersi in modo più sintetico mediante una conversione implicita da un gruppo di metodi a un tipo di delegato compatibile. È davvero solo zucchero sintattico.

A volte non si ha altra scelta che utilizzare la sintassi prolissa se il sovraccarico corretto non può essere risolto dal gruppo metodo a causa di un'ambiguità.

+0

Questo lo riassume molto bene. @keyboardP aggiunge molto alla risposta con la spiegazione del gestore di eventi che assegna/annulla i benefici. – DonBoitnott

9

È la sintassi per la versione precedente del compilatore C# (< = 1.1). Non più necessario. I compilatori attuali sono abbastanza sofisticati per farlo bene.

C'è un (piccolo) vantaggio, a volte. Se si assegnano i gestori di eventi di "+ =", la funzione di completamento automatico di Intellisense potrebbe rendere il codice di scrittura un po 'più veloce.

+1

Questa sintassi non era più necessaria in .Net 2.0. – Gjeltema

+1

Ok, l'ho corretto. Grazie per il suggerimento. – JeffRSon

+1

Passa da -1 a +1. – Gjeltema

7

Il tempo solo quando questo è utile se si sarebbe altrimenti ambiguo - per esempio, se è stato MenuItem(string, Delegate) - di se ci fossero più ugualmente corrispondenza sovraccarichi che corrisponda alla firma. Questo include anche var sintassi (vedi sotto) e tipo generico inferenza (non mostrato):

EventHandler handler = SomeMethod; // fine 
EventHandler handler = new EventHandler(SomeMethod); // fine 
var handler = new EventHandler(SomeMethod); // fine 
var handler = (EventHandler)SomeMethod; // fine 
var handler = SomeMethod; // not fine 

In tutti gli altri casi, è ridondante e non è necessaria in qualsiasi compilatore a partire dal 2.0.

5

correlati a tua modifica - L'aggiunta di gestori non è realmente interessate utilizzando new o no, ma c'è una leggera differenza nella rimozione gestori come questo

listView.ItemClick -= listView_ItemClick; 

e

listView.ItemClick -= new ItemClickEventHandler(listView_ItemClick); 

anche se improbabile influenzare la maggior parte degli scenari. La prima versione, senza la parola chiave new, è presumibilmente più efficiente.

C'è una spiegazione dettagliata nel this post ma la conclusione è

modo da entrambe le opere, ma quale dovremmo usare?Se gli eventi sono sottoscritti/annullati una volta all'inizio/fine come in una tipica applicazione WinForm, allora non ha importanza. Tuttavia, se questo viene fatto più volte poi il secondo approccio è preferibile in quanto fa meno di allocazioni heap costosi e funzionerà più velocemente

(secondo approccio in tale posto essendo quello senza la parola new)

Detto questo, mi sembra una micro ottimizzazione per me, quindi nella maggior parte dei casi è improbabile che si tratti di un collo di bottiglia.

+1

Alla fine, @ByteBlast ha risposto abbastanza bene alla domanda generale, ma +1 per aggiungere questa risposta, fornisce parecchio. – DonBoitnott

Problemi correlati