2009-08-25 6 views
7

필자는 Intellisense 자동 완성을 통해 항상 이와 같은 이벤트 처리기를 할당했습니다.C# 이벤트 처리기를 할당하는 차이점은 무엇입니까?

RangeSelector.RangeChanged += new EventHandler(RangeSelector_RangeChanged); 

최근에 내 동료 중 한 명이이 방법으로 알아 챘습니다.

RangeSelector.RangeChanged += RangeSelector_RangeChanged; 

두 가지 방법 모두 구문 상 올바로 컴파일되고 예상대로 작동합니다.

이러한 방법의 차이점, 이점 또는 단점은 무엇입니까? 그들은 같은 IL 코드를 갖게 되었습니까? 아니면 제가 알고 있어야 할 미묘한 차이점이 있습니까?

답변

12

이러한 방법의 차이점, 장점 또는 단점은 무엇입니까?

두 번째 방법은 새로운 것입니다. 즉, 메서드 그룹 (즉 메서드 이름)에서 대리인으로 자동 변환을 추가 한 C# 2.0 이후로만 지원됩니다. 따라서 생성자 호출은 컴파일러에 의해 추가되고 두 ​​번째 메소드는 첫 번째 구문 통어론입니다.

그 때문에 다른 두 가지 차이점은 없습니다.

두 번째 방법은 첫 번째 방법과 구문이 같지 않으므로 우선적으로 사용해야합니다.

+1

또한 단지 구문 설탕입니다 처리기 자체는 지정하지만 처리기를 할당하거나 할당 취소하는 모든 위치에는 적용되지 않습니다. –

+2

+1하지만 "바람직해야합니다"라는 것은 의문의 여지가 있습니다. + =를 입력하고 탭 버튼을 두 번 누르면 더 새로운 구문이 생성됩니다. 현재 이벤트 처리기를 추가하는 가장 빠른 방법은 IDE 도움말을 사용하여 이전 구문을 생성하는 것입니다. – AnthonyWJones

+0

@Matthew Scharley : Visual Studio의 기본 제공 리팩터링 지원을 사용하면 이러한 문제에 대해 걱정할 필요가 없습니다. –

3

차이가 없으므로 같은 IL이됩니다.

적은 코드로 같은 것을 말하는 것입니다.

3

결과는 두 경우 모두 같습니다. 그러나 후자에서 C# 컴파일러는 코드에서 EventHandler 유형을 유추하여 몇 가지 주요 획을 남겨 둡니다.

2

네, 컴파일러는 두 경우 모두 동일 IL 코드를 생성은, 두 번째 경우는 이벤트 서명을 변경하는 경우, 당신은 단지 두 곳에서 이벤트 선언을 코드를 변경해야하고,

관련 문제