2011-08-22 3 views
1

대리자 유형이 Delegate 클래스에서 상속 된 MulticastDelegate에서 상속된다는 것을 알고 있습니다.델리게이트 형식의 메서드가 내부적으로 생성되는 방식은 무엇입니까?

대리자 인스턴스를 만들 때 위임자의 동일한 서명을 사용하여 세 가지 메서드 (생성자와 별개로 Invoke, BeginInvoke, EndInvoke)를 만듭니다.

어떻게 내부적으로 만들어 졌는지 (대리자 형식 서명이있는 메서드) 이해할 수 없습니까?

미리 감사드립니다.

public delegate int BinaryOp(int x, int y); 

어떻게 컴파일러)를 호출을 (정의하는 방법을 알고 있지, BeginInvoke() 및 EndInvoke() 메소드 :

+0

어떻게 생성됩니까? 코드는 C# 컴파일러에서 생성됩니다. 너는 무엇을 더 알 필요가 있니? –

답변

2

예를 들어 말할 수 있습니다, 우리는이 같은 대리자를 가지고?

이 컴파일러에 의해 생성 된 클래스 :

sealed class BinaryOp : System.MulticastDelegate 
{ 
public BinaryOp(object target, uint functionAddress); 
public int Invoke(int x, int y); 
public IAsyncResult BeginInvoke(int x, int y,AsyncCallback cb, object state); 
public int EndInvoke(IAsyncResult result); 
} 

먼저 통보하는 인보() 메소드 정확히 일치 시키 BinaryOp 대리자의 정의에 대해 정의 된 파라미터 및 반환 값.

BeginInvoke() 멤버 (이 경우 두 개의 정수)에 대한 초기 매개 변수도 BinaryOp 대리자를 기반으로합니다.
그러나 BeginInvoke()는 비동기 메서드 호출을 용이하게하기 위해 사용되는 두 개의 최종 매개 변수 (AsyncCallback 및 개체 유형)를 항상 제공합니다.

마지막으로 EndInvoke()의 반환 값은 원래 대리자 선언과 동일하며 IAsyncResult 인터페이스를 구현하는 개체를 항상 유일한 매개 변수로 사용합니다. 당신이 반사경 또는 ILSpy의 대리자 형식의 IL을 살펴있는 경우

+0

컴파일러가 올바른 매개 변수를 사용하여 메서드를 생성하는 것을 처리한다는 것을 의미합니까? – Syed

+0

예. 컴파일러는 델리게이트의 반환 형식과 매개 변수를 살펴보고 이에 따라 메서드를 만듭니다. 예를 들어, 두 매개 변수가 char 유형 인 경우, 생성 된 클래스의 메소드는 char 유형의 매개 변수를 갖습니다. –

+0

감사합니다.이 컴파일러에서 생성 된 코드는 어디에서 볼 수 있습니까? – Syed

4

, 당신이 이런 식으로 뭔가를 보이는 것을 볼 수 있습니다 :

입니다
.class public sealed System.Action extends System.MulticastDelegate 
{ 
    .method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed {} 

    .method public hidebysig newslot virtual instance void Invoke() runtime managed {} 

    .method public hidebysig newslot virtual instance class System.IAsyncResult BeginInvoke(class System.AsyncCallback callback, object 'object') runtime managed {} 

    .method public hidebysig newslot virtual instance void EndInvoke(class System.IAsyncResult result) runtime managed {} 
} 

, 생성자 (.ctor), Invoke, 및 BeginInvoke/EndInvoke 방법. 또한이 메소드에는 구현이 없으며 (메소드 본문은 비어 있음), runtime으로 표시되어 있음을 알 수 있습니다.

runtime 키워드는 CLR에이 메서드가 CLR 자체에서 제공하는 구현을 필요로한다는 것을 CLR에 나타냅니다. 즉, 위임자의 구현은 CLR 자체 내에서 완전히 Magic입니다. 대리자 형식이로드 될 때 System.Delegate에서 파생 된 CLR은 runtime 플래그를 알기 때문에 특정 대리자 형식에 대해 CLR 내부에서 해당 메서드의 구현을 만듭니다.

이러한 구현이 실제로 어떻게 생겼는지는 .NET 플랫폼, Mono 또는 다른 어떤 것이 든 실행중인 CLR에 달려 있지만 네이티브 코드에 직접있을 가능성이 있습니다.

컴파일러에서 대리자 형식을 컴파일하면 CLR에서 예상하는 패턴과 일치하는 이러한 메서드 스텁을 만들고이를 그대로 둡니다. 델리게이트가 실제로 작동하는 방법은 런타임에 달려 있습니다.

관련 문제