delegate 요약

– 델리게이트를 통해 특정 작업을 캡슐화할 수 있다.

델리게이트 인스턴스에 어떤 메서드를 사용할 수 있는지는 델리게이트 타입의 선언에 따라 다르다.
– 델리게이트 인스턴스 생성을 위해서는 호출할 메서드와 (인스턴스 메서드의 경우) 메서드를 호출할 대상이 필요하다.
– 델리게이트 인스턴스는 불변성(immutable)을 갖는다. 한번 생성되고 나면 변경될 수 없다. 이렇기 때문에 델리게이트를 다른 델리게이트와 합친다거나 다른 메서드의 파라미터로 넘길 때 쓰레드 안정성이나 일관성 유지에 대해 고민하지 않아도 된다.(기존의 인스턴스를 합쳐서 새 인스턴스를 생성하면서 원본 인스턴스는 변경하지 않는다.)
– 각각의 델리게이트 인스턴스는 내부적으로 호출 리스트, 즉 동작의 리스트를 갖는다.
– 델리게이트 인스턴스들을 함께 조합하거나 다른 인스턴스에서 제거할 수 있다.
– 델리게이트 인스턴스에 null을 추가하면 null은 빈 호출 리스트를 갖는 델리게이트 인스턴스로 간주된다.
– 이벤트는 델리게이트 인스턴스가 아니다. 그냥 add/remove 메서드 쌍이다.
# 이벤트
event EventHandler Load;
이벤트는 델리게이트 타입으로 선언을 한다.
이벤트가 애초에 생겨난 이유는 데이터 접근에 한 단계를 더 추가하여 캡슐화를 강화한다.
이벤트를 받도록 등록하거나 등록을 해제하는 경우 델리게이트 타입 필드를 +=과 -= 연산자를 통해 직접 사용하는 것처럼 보인다. 하지만 실제로는 메서드(add/remove)가 호출된다.
컴파일러는 위의 선언을 add/remove 기본 메서드 구현과 private인 델리게이트 타입 필드로 변환해준다. 클래스 내부에서는 이것이 필드로 보이고 외부에서는 이것이 이벤트로만 보인다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다