이벤트 접근자(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번의 경우의 예시이다.
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 |