위임(CLI)

Delegate (CLI)

대리자는 Common Language Infrastructure(CLI; 공통 언어 인프라스트럭처)에서 사용되는 타입 세이프 함수 포인터의 한 형태입니다.위임자는 호출할 메서드를 지정하고 선택적으로 메서드를 호출할 개체를 지정합니다.대리인은 콜백 및 이벤트청취자구현하기 위해 특히 사용됩니다.위임 개체는 메서드에 대한 참조를 캡슐화합니다.그러면 어떤 메서드가 호출되는지 컴파일 시 알 필요 없이 참조된 메서드를 호출할 수 있는 코드로 위임 개체를 전달할 수 있습니다.

멀티캐스트 위임은 여러 [1][2]가지 방법을 가리키는 위임입니다.멀티캐스트 위임은 여러 방식을 실행하는 기능을 제공하는 메커니즘입니다.내부적으로 유지되는 위임 목록이 있으며 멀티캐스트 위임 목록이 호출되면 위임 목록이 실행됩니다.

C#에서는 이벤트 구동형 프로그래밍에서 콜백을 구현하기 위해 위임자가 자주 사용됩니다.예를 들어 위임자를 사용하여 사용자가 일부 버튼을 클릭했을 때 호출해야 하는 메서드를 지정할 수 있습니다.딜러는 프로그래머가 이벤트가 [3]발생했음을 여러 메서드에 알릴 수 있습니다.

C# 코드 예시

타입을 선언하기 위한 코드입니다.named 는 를 파라미터로 하여 다음과 같이 반환됩니다.

위임하다 무효 Send MessageDelegate(메세지 메세지); 

인스턴스화된 위임자를 인수로 사용하는 메서드를 정의하는 코드:

무효 Send Message(메시지 보내기)(Send MessageDelegate send MessageDelegateReference) {     // 대리인과 연결된 다른 대리인을 동시에 호출합니다.     send MessageDelegateReference(신규 메세지("안녕하세요, 이것은 샘플 메시지입니다.")); } 

위임자가 호출되었을 때 실행되는 구현된 메서드:

무효 Handle Send Message(메시지 보내기)(메세지 메세지) {     // Sender 및 Message 클래스의 실장은 이 예와 관련이 없습니다.     송신자.보내세요(메세지); } 

Send Message 메서드를 호출하는 코드. 인스턴스화된 위임자를 인수로 전달합니다.

Send Message(메시지 보내기)(신규 Send MessageDelegate(Handle Send Message(메시지 보내기))); 

위임자(C#)

위임하다 무효 알림(스트링 송신자);  // 키워드 delegate를 사용한 일반 메서드시그니처  알림 인사말;                       // 변수 위임  무효 잘 지내시나요(스트링 송신자) {     콘솔.기입선("안녕하십니까?" + 송신자 + '?'); }  인사말 = 신규 알림(잘 지내시나요); 

위임 변수는 연관된 메서드를 호출하고 다음과 같이 호출합니다.

인사말('안톤');                       // "안톤"에게 전화를 걸어 "안녕하세요, 안톤?"이라고 인쇄합니다. 

위임 변수는 양식의 1등급 개체입니다.new DelegateType(obj.Method)모든 일치 방법 또는 값에 할당할 수 있습니다.null파라미터 없이 메서드와 그 수신기를 저장합니다.[4]

신규 위임.유형(퍼니옵지.잘 지내시나요); 

오브젝트funnyObj수 있습니다.this생략했습니다.방법이 다음과 같은 경우static오브젝트(다른 언어에서는 인스턴스라고도 함)가 아니라 클래스 자체여야 합니다.그래서는 안 된다abstract단, 그럴 수도 있습니다.new,override또는virtual.

위임자를 사용하여 메서드를 호출하려면 메서드시그니처가DelegateType같은 종류의 파라미터 수가 동일한 경우(ref,out,value(반환 타입 포함)이 같은 타입입니다.

멀티캐스트 위임(C#)

위임 변수는 여러 값을 동시에 유지할 수 있습니다.

무효 잘 지내시나요(스트링 송신자) {     콘솔.기입선("안녕하십니까?" + 송신자 + '?'); }  무효 오늘 기분 어때(스트링 송신자) {     콘솔.기입선("오늘은 어때?" + 송신자 + '?'); }  알림 인사말;  인사말 = 잘 지내시나요; 인사말 += 오늘 기분 어때;  인사말('레오나르도');                  // "안녕하세요, 레오나르도?"                                       // "오늘은 어때, 레오나르도?"  인사말 -= 잘 지내시나요;  인사말("페레이라');                   // "오늘은 잘 지냈니, 페레이라?" 

멀티캐스트 대리인이 함수이거나 없는 경우out파라미터, 마지막 콜의 파라미터가 [5]반환됩니다.

기술 구현 상세

내부 구현은 다를 수 있지만 위임 인스턴스는 개체태플메서드 포인터 및 다른 위임자에 대한 참조(아마도 null)로 간주할 수 있습니다.따라서 한 명의 딜러에 대한 언급은 여러 명의 딜러에 대한 언급일 수 있습니다.첫 번째 대리인이 완료되면 체인 참조가 null이 아닌 경우 목록이 완료될 때까지 다음 대리인이 호출됩니다.이 패턴을 통해 이벤트는 단일 참조에서 위임 목록까지 쉽게 오버헤드를 확장할 수 있으며 CLI에서 널리 사용됩니다.

성능

예전에는 대리인의 퍼포먼스가 가상 또는 인터페이스 메서드콜보다 훨씬 느렸습니다(2003년 Microsoft [6]벤치마크에서는 6~8배 느립니다).2005년의 NET 2.0 CLR은 인터페이스 [7]콜과 거의 동일합니다.즉, 직접 메서드 호출에 비해 추가 오버헤드가 적습니다.

대의원 계급의 건설에는 매우 엄격한 규칙이 있다.이러한 규칙에 따라 [citation needed]컴파일러를 최적화하는 동시에 딜러를 최적화할 때 많은 여유를 갖게 됩니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Microsoft Developer Network (MSDN) 기사"How to: Combin Diagers (멀티캐스트 대리인) (C# Programming Guide), 2008년 5월 20일 접속
  2. ^ "About Microsoft's "Delegates"". Sun Developer Network. Sun Microsystems. Archived from the original on 10 February 1999.
  3. ^ Wikibooks: C 샤프 프로그래밍/대리점 및 이벤트
  4. ^ Mössenböck, Hanspeter (2002-03-25). "Advanced C#: Variable Number of Parameters" (PDF). Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik. pp. 23–24. Retrieved 2011-08-04.
  5. ^ Mössenböck, Hanspeter (2002-03-25). "Advanced C#: Variable Number of Parameters". Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik. p. 25. Retrieved 2011-08-04.
  6. ^ Gray, Jan (June 2003). "Writing Faster Managed Code: Know What Things Cost". Microsoft. Retrieved 2007-09-09.
  7. ^ Sturm, Oliver (2005-09-01). "Delegate calls vastly sped up in .NET 2". Retrieved 2007-09-09.

외부 링크