델리게이트(대리자)
대리자 - C# 프로그래밍 가이드
대리자(C# 프로그래밍 가이드)Delegates (C# Programming Guide) 이 문서의 내용 --> 대리자는 특정 매개 변수 목록 및 반환 형식이 있는 메서드에 대한 참조를 나타내는 형식입니다.A delegate is a type that represents references to methods with a particular parameter list and return type. 대리자를 인스턴스화하면 모든 메서드가 있는 인스턴스를 호환
docs.microsoft.com
공변성 – 델리게이트의 원형에서 정의한 반환 타입을 상속하는 타입을 반환하는 메서드를 델리게이트에 바인드할 수 있음
반공변성 – 델리게이트의 원형에 정의한 매개변수의 부모타입을 매개변수로 받는 메서드를 델리게이트에 바인드할 수 있음
delegate Object A (FileStream st)
String B(Stream s)
이렇게 바인드 가능하다는 것
반환 – 공변성
매개변수 – 반공변성
Int32 C(Stream st)는 불가 – Int32가 값 형태
내부
_target – System.Object -
필드 |
타입 |
설명 |
_target |
System.Object |
정적 메서드일 경우 null |
_methodPtr |
System.IntPtr |
CLR이 콜백으로 호출해야 하는 메서드를 식별하기 위한 내부 정수 |
_invocationList |
System.Object |
보통 null |
Combine이란 함수로 델리게이트가 추가되는 식 – 델리게이트 체인
+=, -= 로 오버로드 되어있기에 편하게 사용 가능
기본 델리게이트 체인은 전체 순회 방식이기 때문에 중간에 오류가 나거나 반환 값이 마지막 제외 모두 소실 등 견고하지 못함.
-> GetInvocationList() 함수로 메서드 배열을 받아와 직접 알고리즘을 제작할 수 있게 배려
Public delegate void Action();
Public delegate void Action<T>(T obj);
식으로 델리게이트를 이미 제네릭으로 만들어놓았다. 17개의 매개변수까지 제네릭 가능
편의사항
l 델리게이트 객체를 생성할 필요가 없다.
l 콜백 메서드를 정의하지 않아도 됨(람다 가능) – 익명 메서드(Anonymous Function)를 만드는 방법 중 하나(다른 하나는 직접 익명메서드를 제작)
-C#에서는 메서드 이름에 < 를 추가하여 겹칠 가능성을 배제한다.
리플렉션
System.Reflection.MethodInfo – CreateDelegate(type t, target o)
델리게이트를 리플렉션으로 가져올 수 있다.