2009-08-11 3 views
4

일부 이벤트에 등록하고 싶습니다. 다음과 같은 방법으로 작동 :이 같은 일을 단지 다른 구문입니다다음 이벤트 간의 등록 방법에는 차이가 있습니까?

public void AddOptionAsListner(OptionElement option) 
    { 
     option.Selected += onOptionSelectedChanged; 
    } 

public void AddOptionAsListner(OptionElement option) 
    { 
     option.Selected += new EventHandler(onOptionSelectedChanged); 
    } 

차이가 아니면?

+0

이것은 속입니다. –

+0

차이가 없습니다. 내 0.02c, 이벤트 등록을 취소하는 동안도 마찬가지입니다. –

+2

@Mehrdad - 적어도 중복에 대한 링크를 제공 할 수 있습니다. – Elad

답변

9

동일 - 차이가 없습니다. 컴파일러는 델리게이트의 타입을 추론하고 자동으로 당신을 대신합니다. 당신의 인생을 좀 더 편하게 해주는 구문 설탕

그냥 깊이 C#으로 확인. 이 기능을 "방법 그룹 변환"; C# 2.0에 추가되었습니다.

내가 반사경이를 열면 책에서

static void MyMethod() { ... } 
static void MyMethod(object sender, EventArgs e) {...} 

static void Main() { 
    ThreadStart x = MyMethod; // binds to first overload 
    EventHandler y = MyMethod; // binds to second overload 
} 

, 당신은 물론 무대 뒤에서, 컴파일러는 당신을 위해 올바른 유형의 대리자 인스턴스를 만들어 볼 것입니다.

L_0000: ldnull 
    L_0001: ldftn void CS.Temp.Program::MyMethod() 
    L_0007: newobj instance void [mscorlib]System.Threading.ThreadStart::.ctor(object, native int) 
    L_000c: pop 
    L_000d: ldnull 
    L_000e: ldftn void CS.Temp.Program::MyMethod(object, class [mscorlib]System.EventArgs) 
    L_0014: newobj instance void [mscorlib]System.EventHandler::.ctor(object, native int) 
    L_0019: pop 
+0

후자는 내 기억이 도움이된다면, 1.1에서 요구되었던 오래된 sintax입니다. 아니면 2.0 일 수도 있습니다. 그러나 이제 컴파일러는 그 자체로 트릭을 수행합니다. –

+0

맞아 .. ref book으로 다시 확인하는 과정에 있었어 :) 2.0+ 컴파일러는 이제 메소드/메소드 그룹을 적절한 유형의 델리게이트로 변환 할만큼 똑똑하다. – Gishu

3

새로운 EventHandler()는 중복 된 것과 같은 결과입니다.

이벤트 처리기에 대한 대리자를 명시 적으로 만들 필요가 없습니다.

+0

작은 차이점은 주먹이 C# 1.0에서 컴파일되지 않는다는 것입니다. –

+0

좋은 지적이지만 질문에 C# 3.0 태그가 붙어있어서 언급하지 않았습니다. – Brandon

0

런타임에 관한 한 차이는 없습니다. 컴파일러는 이 약간 인 것으로 간주하여 이벤트 자체의 서명을 기반으로 대리인 (사용자 이벤트 처리 방법)의 서명을 유추해야하며 두 번째는 서명이 무엇인지 알려야합니다.

두 번째 서명은 이벤트에 가입 할 때 "자동"(즉, "탭, 탭"시퀀스)을 사용하면 Visual Studio에서 자동으로 생성되는 서명입니다.

관련 문제