2011-02-10 5 views
11

일반적으로 우리는이 코드를 사용합니다 :짧은 방법으로 이벤트를 작성 하시겠습니까?

 private EventHandler _updateErrorIcons; 
    public event EventHandler UpdateErrorIcons 
    { 
     add { _updateErrorIcons += value; } 
     remove { _updateErrorIcons -= value; } 
    } 

자동 속성과 비슷한 지름길이 있습니까? 다음과 같음 :

 public event EventHandler UpdateErrorIcons { add; remove; } 
+0

정말 재밌습니다. 대부분의 사람들은 확장 코드에 대해 전혀 듣지 못했습니다. – Andrey

+0

예, 사람들이 이것을 보았지만 개인적으로 이것을 사용하지는 않았지만 나중에 컴파일러에서 추가합니다. –

답변

14

예. { add; remove; } 부분과 백업 위임 필드를 제거하고 당신은 황금거야하기 : 그것은

public event EventHandler UpdateErrorIcons; 

의 그!

이 질문에 앞서 질문을 추가하기 만하면 자동 구현 버전의 이벤트가 속성과 일치하지 않는다고 생각하지 않았습니다. 개인적으로, 실제로 은 자동 구현 된 이벤트가 처음 시도한 방식대로 작동하는 경우을 선호합니다. 보다 일관성 있고 이벤트가 이 아닌이 위임 필드와 동일하다는 사실을 상기시키는 역할을합니다. 속성은 일반 필드와 동일하지 않습니다.

솔직히 사용자 정의 구문 첫 번째로에 대해 알고있는 경우가 드뭅니다. 많은 .NET 개발자는 자신의 addremove 메서드를 전혀 구현할 수 없다는 단서가 없습니다.


업데이트 : 그냥 마음의 자신의 평화를 위해, 나는 Reflector를 사용하여 확인했다고 C# 4 이벤트의 기본 구현 (즉, 당신은 자동 실행 경로를 이동 할 때 생성됩니다 구현) 이 동일합니다 : 위 효과적으로 addremove 통화를 직렬화 잠금 무료 동기화를 사용

private EventHandler _updateErrorIcons; 
public event EventHandler UpdateErrorIcons 
{ 
    add 
    { 
     EventHandler current, original; 
     do 
     { 
      original = _updateErrorIcons; 
      EventHandler updated = (EventHandler)Delegate.Combine(original, value); 
      current = Interlocked.CompareExchange(ref _updateErrorIcons, updated, original); 
     } 
     while (current != original); 
    } 
    remove 
    { 
     // Same deal, only with Delegate.Remove instead of Delegate.Combine. 
    } 
} 

하는 것으로. 따라서 최신 C# 컴파일러를 사용하는 경우 add/remove 자신을 까지 동기화 할 필요가 없습니다.

+3

그리고 뒷받침 분야. (실제로, OP, 많은 사람들이'add '와'remove' 이벤트 접근자를 모르고 있음을 알게 될 것입니다.) –

+0

우리는 동기화를 위해 몇몇 이벤트에서 add & remove를 사용하고 있습니다. – Carra

+0

@Carra : 사용중인 C# 컴파일러 버전에 따라 걱정할 필요가 없습니다. http://blogs.msdn.com/b/cburrows/archive/2010/03/05/events- c-4-part-i-locks.aspx –

4
public event EventHandler UpdateErrorIcons; 

당신이

yourObbject.UpdateErrorIcons += YourFunction; 
2

add {}remove {} 만 수동으로 이벤트 만남을 처리 할 필요가 특별한 경우에 사용되는 사용할 수있는 잘입니다. 단순한 필사자는 일반적으로 public event EventHandler UpdateErrorIcons;을 사용합니다. 여기서 "EventHandler"는 선택의 위임자입니다. 예를 들어

: myEvent가가 null이기 때문에 당신이 그것을 호출하기 전에 null의 경우 확인해야 리스너가없는 경우 있음을

public delegate void MyEventDelegate(object sender, string param1); 
public event MyEventDelegate MyEvent;

참고. 이 검사를 수행하는 표준 방법은 다음과 같습니다

public void InvokeMyEvent(string param1) 
{ 
    MyEventDelegate myEventDelegate = MyEvent; 
    if (myEventDelegate != null) 
     myEventDelegate(this, param1); 
} 

이 검사의 핵심 요소는 첫 번째 질문에서 객체의 복사본을 만든 다음 복사에서만 작동하는 것입니다.그렇지 않다면 희귀 한 경쟁 조건을 얻을 수 있는데, 여기서 다른 스레드는 if와 호출 사이를 끊어 버립니다.

+0

예, 일반적으로 나중에 동기화를 추가 할 때 사용합니다. – Carra

+0

@Carra : 제가 틀린 것이 아니라면, 최신 버전의 .NET 프레임 워크에서'add'와'remove'의 기본 구현은 실제로 동기화를 포함합니다. –

관련 문제