본문 바로가기

C#

C# 이벤트(Events) 접근자와 수정자

이벤트 접근자(accessor): 구독과 해제(+=, -=) 연산을 이벤트에 맞게 구현하기 위한 것.

(속성 접근자는 get, set이 있다.)

public event EventHandler CustomEvent;

이로부터 컴파일러는 다음 멤버를 암묵적으로 생성함.

  • private delegate 필드 1개
  • public 이벤트 접근자 +=, -= 연산(add_CustomEvent, remove_CustomEvent 함수)

접근자를 다른 방식으로 구현하고 싶으면 명시적으로 구현하면 된다. 다음은 그 예시이다.

//전용 대리자 필드 선언
private EventHandler customEvent;

//공용 이벤트 접근자 함수
public event EventHandler CustomEvent
{
	add	{ customEvent += value; }
    remove	{ customEvent -= value; }
}

(C# 기본 구현은 Lock-free을 지나 compare-and-swap 알고리즘을 이용해서 대리자 갱신의 스레드 안전성을 보장함)

이것을 쓰는 이유는 주로 다음 세 가지가 있다.

  1. 이벤트를 선언하는 인터페이스를 명시적으로 구현
  2. 이벤트 접근자들이 다른 클래스에 이벤트 방송을 위임하는 역할만 할 때
  3. 클래스가 많은 수의 이벤트를 노출하나 이벤트들은 구독자가 거의 없을 때.(예: 윈도우 컨트롤에서 구독자의 대리자를 사전구조로 저장.)

아래가 1번의 경우의 예시이다.

public interface IFun { event EventHandler ExampleEvent; }

class Fun : IFun
{
	private EventHandler exampleEvent;
    //인터페이스의 구현
    event EventHandler IFun.ExampleEvent
    {
    	add	{ exampleEvent += ExampleEvent; }
        remove	{ exampleEvent -= ExampleEvent; }
    }
}

이벤트 수정자(Event Modifiers) : 메서드처럼 이벤트에도 virtual, override, abstract, sealed, static 수정자를 붙일 수 있다.

public class _
{
	public static event EventHandler<EventArgs> StaticEvent;
	public virtual event EventHandler<EventArgs> VirtualEvent;
}

참고문헌: C# 8.0 in a Nutshell, Joseph Albahari. Eric Johannsen. pp163-165.

'C#' 카테고리의 다른 글

[Notion] Rx.Net in Action 요약 정리  (0) 2022.03.10
C# 제네릭(Generics) 1  (0) 2020.11.30
C# EventHandler 표준 이벤트 구현  (0) 2020.11.27
C# 이벤트(Events)  (0) 2020.11.26
C# 람다식(Lambda Expressions)  (0) 2020.11.16