2013-07-03 11 views
8

Przypisując obsługi zdarzeń do czegoś jak kontekście MenuItem, na przykład, istnieją dwa dopuszczalne składnie:Czy można skorzystać z jawnej deklaracji "new EventHandler"?

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

... i ...

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

ja również pamiętać, że te same pojawi stosuje się do tego:

listView.ItemClick += listView_ItemClick; 

... i ...

listView.ItemClick += new ItemClickEventHandler(listView_ItemClick); 

Czy jest jedna szczególna korzyść dla drugiej (jawnej) nad pierwszą? Czy jest to bardziej stylistyczne pytanie?

Odpowiedz

9

W C# 1.0 nie miałeś innego wyjścia, jak wyraźnie zdefiniować typ delegata i cel.

Od wersji C# 2.0 kompilator umożliwia wyrażanie siebie w bardziej zwięzły sposób poprzez niejawną konwersję z grupy metod do zgodnego typu delegata. To naprawdę po prostu cukier syntaktyczny.

Czasami nie masz wyboru, musisz użyć składni długich zwojów, jeśli prawidłowe przeciążenie nie może zostać usunięte z grupy metod z powodu niejasności.

+0

Podsumowuje to całkiem nieźle. @keyboardP dodaje wiele do odpowiedzi z wyjaśnieniem, jak program obsługi zdarzeń przypisuje/cofa przypisanie korzyści. – DonBoitnott

9

Jest to składnia dla starszej wersji kompilatora C# (< = 1.1). Już nie potrzebne. Obecne kompilatory są wystarczająco skomplikowane, aby to naprawić.

Czasami jest jedna (mała) korzyść. Jeśli przypiszesz funkcje obsługi zdarzeń przez "+ =", funkcja autouzupełniania IntelliSense może przyspieszyć pisanie kodu.

+1

Ta składnia nie była już potrzebna w .Net 2.0. – Gjeltema

+1

Dobra - poprawiłem to. Dzięki za podpowiedź. – JeffRSon

+1

Przełączono -1 na +1. – Gjeltema

7

Czas tylko kiedy ta jest przydatna, jeśli jest to inaczej być dwuznaczne - na przykład, jeśli było MenuItem(string, Delegate) - gdyby nie było od wielu równie dopasowania przeciążenia, które będzie pasować do podpisu. Obejmuje to również var składni (pokazany poniżej), a typ ogólny wnioskowanie (nie pokazane):

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 

We wszystkich innych przypadkach, jest zbędny i nie jest konieczne w każdym kompilator 2,0 roku.

5

pokrewne do edycji - The dodanie ładowarki jest naprawdę nie wpływa za pomocą new lub nie, ale istnieje niewielka różnica w usuwania ładowarki jak to

listView.ItemClick -= listView_ItemClick; 

i

listView.ItemClick -= new ItemClickEventHandler(listView_ItemClick); 

choć mało prawdopodobne, aby wpłynęły na większość scenariuszy. Pierwsza wersja, bez słowa kluczowego new, jest podobno wydajniejsza.

tam szczegółowe wyjaśnienie w this post ale konkluzja jest

więc obie prace, ale który z nich powinniśmy używać?Jeśli zdarzenia są subskrybowane/anulowane subskrypcji raz na początku/końcu, jak w typowej aplikacji WinForm , to nie ma to znaczenia. Jednakże, jeśli odbywa się to wielokrotnie potem drugie podejście jest korzystne, gdyż nie mniej kosztownych alokacji sterty i będzie działać szybciej

(drugie podejście w tym poście jest jeden bez słowa kluczowego new)

Powiedziawszy, że wydaje mi się to mikrooptymalizacją, więc w większości przypadków nie jest to wąskie gardło.

+1

W końcu, @ByteBlast odpowiedział na ogólne pytanie dość dobrze, ale +1 za dodanie tej odpowiedzi, zapewnia całkiem sporo. – DonBoitnott

Powiązane problemy