영어로 읽기

다음을 통해 공유


방법: 이벤트 속성을 사용하여 여러 이벤트 처리

이벤트 속성을 사용하려면 이벤트를 발생시키는 클래스에서 이벤트 속성을 정의한 다음 이벤트를 처리하는 클래스에서 이벤트 속성의 대리자를 설정합니다. 클래스에서 여러 이벤트 속성을 구현하려면 클래스가 각 이벤트에 대해 정의된 대리자를 내부적으로 저장 및 유지 관리해야 합니다. 각 필드 유사 이벤트에 대해 해당 지원 필드 참조 형식이 생성됩니다. 이로 인해 이벤트 수가 증가하면 불필요한 할당이 발생할 수 있습니다. 대안으로, 일반적인 방식은 이벤트를 키별로 저장하는 EventHandlerList를 유지하는 것입니다.

각 이벤트에 대한 대리자를 저장하려면 EventHandlerList 클래스를 사용하거나 고유한 컬렉션을 구현하면 됩니다. 컬렉션 클래스는 이벤트 키에 따라 이벤트 처리기 대리자를 설정, 액세스 및 검색하는 메서드를 제공해야 합니다. 예를 들어 Hashtable 클래스를 사용하거나 DictionaryBase 클래스에서 사용자 지정 클래스를 파생시킬 수 있습니다. 대리자 컬렉션의 구현 세부 정보는 클래스 외부에 노출할 필요가 없습니다.

클래스 내의 각 이벤트 속성은 add 접근자 메서드 및 remove 접근자 메서드를 정의합니다. 이벤트 속성에 대한 add 접근자는 대리자 컬렉션에 입력 대리자 인스턴스를 추가합니다. 이벤트 속성에 대한 remove 접근자는 대리자 컬렉션에서 입력 대리자 인스턴스를 제거합니다. 이벤트 속성 접근자는 이벤트 속성의 미리 정의된 키를 사용하여 대리자 컬렉션에서 인스턴스를 추가 및 제거합니다.

이벤트 속성을 사용하여 여러 이벤트 처리하려면

  1. 이벤트를 발생시키는 클래스 내에서 대리자 컬렉션을 정의합니다.

  2. 각 이벤트에 대한 키를 정의합니다.

  3. 이벤트를 발생시키는 클래스에서 이벤트 속성을 정의합니다.

  4. 대리자 컬렉션을 사용하여 이벤트 속성에 대한 add 및 remove 접근자 메서드를 구현합니다.

  5. public 이벤트 속성을 사용하여 이벤트를 처리하는 클래스에서 이벤트 처리기 대리자를 추가 및 제거합니다.

예시

다음 C# 예제에서는 EventHandlerList를 사용하여 각 이벤트의 대리자를 저장하는 이벤트 속성 MouseDownMouseUp을 구현합니다. 이벤트 속성 구문의 키워드는 굵은 글꼴로 표시됩니다.

C#
// The class SampleControl defines two event properties, MouseUp and MouseDown.
class SampleControl : Component
{
    // :
    // Define other control methods and properties.
    // :

    // Define the delegate collection.
    protected EventHandlerList listEventDelegates = new EventHandlerList();

    // Define a unique key for each event.
    static readonly object mouseDownEventKey = new object();
    static readonly object mouseUpEventKey = new object();

    // Define the MouseDown event property.
    public event MouseEventHandler MouseDown
    {
        // Add the input delegate to the collection.
        add
        {
            listEventDelegates.AddHandler(mouseDownEventKey, value);
        }
        // Remove the input delegate from the collection.
        remove
        {
            listEventDelegates.RemoveHandler(mouseDownEventKey, value);
        }
    }

    // Raise the event with the delegate specified by mouseDownEventKey
    private void OnMouseDown(MouseEventArgs e)
    {
        MouseEventHandler mouseEventDelegate =
            (MouseEventHandler)listEventDelegates[mouseDownEventKey];
        mouseEventDelegate(this, e);
    }

    // Define the MouseUp event property.
    public event MouseEventHandler MouseUp
    {
        // Add the input delegate to the collection.
        add
        {
            listEventDelegates.AddHandler(mouseUpEventKey, value);
        }
        // Remove the input delegate from the collection.
        remove
        {
            listEventDelegates.RemoveHandler(mouseUpEventKey, value);
        }
    }

    // Raise the event with the delegate specified by mouseUpEventKey
    private void OnMouseUp(MouseEventArgs e)
    {
        MouseEventHandler mouseEventDelegate =
            (MouseEventHandler)listEventDelegates[mouseUpEventKey];
        mouseEventDelegate(this, e);
    }
}

참고 항목


추가 리소스

학습

모듈

Create and Manage Events - Training

Discover how events facilitate communication between objects in C#, and how their integration with delegates creates robust, decoupled code.