2009-08-25 15 views
7

Zawsze przypisałem funkcje obsługi zdarzeń podobne do tej, kierując się automatycznym uzupełnianiem IntelliSense.Różnice w przypisywaniu procedur obsługi zdarzeń C#?

RangeSelector.RangeChanged += new EventHandler(RangeSelector_RangeChanged); 

Niedawno zauważyłem, że jeden z moich kolegów robi to w ten sposób.

RangeSelector.RangeChanged += RangeSelector_RangeChanged; 

Obie metody są poprawne pod względem składni, kompilują się i zachowują zgodnie z oczekiwaniami.

Jakie są różnice, zalety lub wady tych metod. Czy skutkują tym samym kodem IL, czy też jest jakaś subtelna różnica, o której muszę wiedzieć?

Odpowiedz

12

Jakie są różnice, zalety lub wady tych metod.

Druga metoda jest nowsza, to znaczy jest obsługiwana tylko od C# 2.0 (jak sądzę), która dodała do delegata automatyczną konwersję z grupy metod (tj. Nazwę metody). Wywołanie konstruktora jest więc dodawane przez kompilator, a druga metoda jest po prostu syntaktycznym cukrem dla pierwszego.

Z tego powodu nie ma żadnych innych różnic między tymi dwoma.

Ponieważ druga metoda jest taka sama jak pierwsza, z mniejszą składnią, powinna być preferowana.

+1

Ponadto, jeśli zmienić podpis zdarzeń, trzeba tylko zmienić kod w dwóch miejscach, deklarację imprez i sam program obsługi, ale nie w miejscu, w którym przypiszesz/cofniesz obsługę. –

+2

+1, jednak jako "powinien być preferowany", który jest wątpliwy. Jeśli wpisanie + = a następnie naciśnięcie przycisku zakładki dwukrotnie wygeneruje nowszą składnię, zgodzę się. Obecnie najszybszym sposobem dodania obsługi zdarzeń jest wygenerowanie starszej składni za pomocą pomocy IDE. – AnthonyWJones

+0

@Matthew Scharley: jeśli użyjesz wbudowanej obsługi programu Visual Studio do refaktoryzacji, nie musisz się martwić o takie rzeczy. –

3

Bez różnicy, daje tę samą IL.

To tylko sposób na powiedzenie tego samego z mniejszą ilością kodu.

3

Wynik jest taki sam w obu przypadkach. Ale w tym ostatnim kompilator C# wyprowadzi typ EventHandler z kodu, oszczędzając w ten sposób kilka kluczowych kresek.

2

tak, kompilator tworzy ten sam kod IL w obu przypadkach, drugi przypadek jest tylko cukier składnia

Powiązane problemy