2012-12-21 1 views
2

다음 코드를 컴파일 할 수 없습니다.C# CS0079 이벤트 처리 컴파일 오류

컴파일 오류 CS0079 : 이벤트 '맞춤 이벤트'는의 왼쪽에 나타날 수 + = 또는 - = 내가이 일을 할 수있는 방법

if (CustomEvent != null) //CS0079 
    CustomEvent(null, null); //CS0079 

?

내 구현은 다음과 같다 : 그것은 현재의 형태로 선언 된 필드와 같은 이벤트 경우에만 검사/이벤트를 호출 할 수 있습니다

public delegate void EventHandler(object sender, EventArgs e); 
public static event EventHandler CustomEvent 
{ 
    add { CustomEvent += value; } 
    remove { CustomEvent -= value; } 
} 
private static void Func() 
{ 
    if (CustomEvent != null)  //CS0079 
     CustomEvent(null, null); //CS0079 
} 
+0

'CustomEvent' 란 무엇입니까? –

+0

사용자 지정 이벤트로 컨트롤을 연결하려고하면 어떻게됩니까? – SpaceApple

+0

@SpaceApple 그는 그렇지 않습니다. 그가 * 호출하고 있습니다. –

답변

5

편집 내용이 다음과 같이 재귀 호출을 표시합니다. 사용자 정의 이벤트를 다시 선언하면 은 백업 필드를 제공하기위한 것입니다. 예를 들어 :

Func에서 나는 필드 ( customEvent)를 참조 오전
private static EventHandler customEvent; 
public static event EventHandler CustomEvent 
{ 
    add { customEvent += value; } 
    remove { customEvent -= value; } 
} 
private static void Func() 
{ 
    var tmp = customEvent; 
    if (tmp != null) tmp(null, null); 
} 

주의가 아닌 이벤트 (CustomEvent).

그러나 이것은 단순한는 필드와 같은 이벤트로 (thread에 대해서 안전한) 더 나은입니다 : 필드와 같은 이벤트가 event 키워드를 사용

public static event EventHandler CustomEvent; 
private static void Func() 
{ 
    var tmp = CustomEvent; 
    if (tmp != null) tmp(null, null); 
} 

하지만 접근자를 생략 : 컴파일러가 추가 많은 보일러 판 (backing field, thread-safe 구현 추가/삭제). 또한, 이벤트 이름 (선언 유형에서)을 통해 백업 파일 에 액세스 할 수 있으므로 라인 var tmp = CustomEvent;이 어떻게 작동 하는지를 알 수 있습니다.

또한 정적 이벤트에 매우주의하십시오. 우연히 많은 물건을 살아있게하는 훌륭한 방법입니다.

+0

감사합니다. Marc! 이 http://www.gavaghan.org/blog/2007/07/25/intercepting-add-and-remove-of-c-event-delegates/ 상태로 짐작합니다. "이벤트를 선언하면 컴파일러에서 다음을 제공합니다. 숨겨진 대리자에서 핸들러를 추가하고 제거하려면 + = 및 - = 연산자가 구현됩니다.그러나 키워드 추가 및 제거를 사용하여 + = 및 - =에 대한 고유 한 동작을 명시 적으로 구현할 수 있습니다. " – Chris

+0

@Chris 설명은"필드와 유사한 이벤트 "에 적용되지 않습니다. 즉, 'add' /'remove '접근 자. 접근자를 제공하면 구현을 완전히 제어 할 수 있습니다. 자동으로 구현되는 속성과 규칙적인 속성이 약간 비슷합니다. 블로그 게시물을 수정하는 주석을 남겼습니다. :) –

3

. 그래서 두 가지 시나리오는이 문제를 일으킬 것이라고이 있습니다 :

  1. 이 필드 같은 이벤트가 아니라 사용자 정의 add/remove 접근을 가지고있는 경우에만 사용자 정의 코드가 대리자가 저장되는 방법을 알고

  2. 현재 유형에서는 선언되지 않았지만 기본 유형 또는 관련이없는 객체에 있습니다.이 경우에는 일반적으로 OnCustomEvent 메소드를 통해 이벤트를 호출하기 위해 선언 유형을 가져와야합니다 . 염기 형의 경우, 규칙은 서브 클래스 override


(코멘트)을 통해 이벤트에 이벤트 후크를 호출 할 수 있도록 이러한 방법 protected virtual을 만드는 것

case1처럼 보입니다. 그러나이 문제를 해결하기 위해 무엇을해야하는지 이해할 수 없습니다.당신이있는 경우

/remove 사용자 정의 add, 다음 호출 할 어떻게 구현 고유 (나는 내가 add/remove를 볼 수 있다면 더 말할 수), 그러나의 두 가지 일반적인 구현을 살펴 보자입니다 :

A : 배킹 대표 :이 경우

private EventHandler someEvent; 
public event EventHandler SomeEvent 
{ 
    add { someEvent += value; } 
    remove { someEvent -= value; } 
} 

은 "호출"구현은 다음과 같습니다

if(someEvent != null) someEvent(this, EventArgs.Empty); 

또는 여분의주의를 기분 경우 :

var handler = someEvent; 
if(handler != null) handler(this, EventArgs.Empty); 

(1B) : 측정 EventHandlerList (스파 스 이벤트에 사용) 다음 호출 구현 될

private static readonly object SomeEventKey = new object(); 
public event EventHandler SomeEvent 
{ 
    add { Events.AddHandler(SomeEventKey, value); } 
    remove { Events.RemoveHandler(SomeEventKey, value); } 
} 

하는 경우 :

var handler = (EventHandler)Events[SomeEventKey]; 
if(handler != null) handler(this, EventArgs.Empty); 
+0

case1처럼 보입니다. 그러나이 문제를 해결하기 위해 무엇을해야하는지 이해할 수 없습니다. – Chris

+0

@Chris 1에서 확장합니다 ... 잠시만 기다려주십시오 –

+0

if (customEvent! = null)가 다른 함수에서 사용되었으므로이 표현 자체가 컴파일 오류 CS0079를 발생시킵니다. 이것이 문제입니다. – Chris