c\#의뢰 의 본질은 무엇 입 니까
4.567915.제 가 이해 하 는-C\#에서 왜 의뢰 를 해 야 하 는 지,주제 에서 의뢰 가 무엇 인지,의뢰 가 간단 한 응용 인지 간단하게 소 개 했 습 니 다.이 주제 에서 의뢰 에 대해 진일보 한 소 개 를 할 것 입 니 다.본 주 제 는 주로 위원회 의 본질 과 의뢰 체인 에 대해 토론 을 할 것 입 니 다.
1.의뢰 의 본질
평소에 우 리 는 의뢰 를 사용 하기 쉽다--C 로# delegate 키 워드 는 의뢰 를 정의 하고 new 연산 자 를 사용 하여 의뢰 인 스 턴 스 를 구성 한 다음 에 의뢰 인 스 턴 스 를 호출 하여 리 셋 방법 을 호출 합 니 다. mydelegate =new Mydelegate(obj.mymethod),MyDelegate 정 의 된 의뢰 입 니 다.매개 변수 가 없다 고 가정 한 다음 에 의뢰 인 스 턴 스 를 호출 하 는 것 이 이 렇 습 니 다.my delegate()는 이때 의뢰 와 호출 방법 을 호출 하 는 방식 이 똑 같다 는 것 을 알 수 있 습 니 다.앞 에 있 는 my delegate 를 보지 않 으 면 의뢰 인 스 턴 스 를 호출 하 는 것 이 아니 라 직접 호출 하 는 방법 이 라 고 생각 할 것 입 니 다.이 예 를 통 해 여러분 들 은 이 말 을 쉽게 이해 하 실 수 있 을 것 입 니 다.의뢰 대상 의 변수 로 방법 명 을 대체 합 니 다)괄호 안의 설명 을 통 해 여러분 들 이 의뢰 에 대해 더 많은 이 해 를 가 질 것 이 라 고 믿 습 니 다.의뢰 는 바로 방법의 대용품 입 니 다.의뢰 변 수 는 이때 방법 명 이 므 로 의뢰 는 방법의'별명'이라는 것 을 간단하게 이해 할 수 있 습 니 다.
앞에서 의뢰 한 사용 과 이 해 를 소 개 했 습 니 다.지금 은 컴 파일 러 와 CLR 이 뒤에서 우리 에 게 delegate 를 사용 하 는 것 을 좀 더 살 펴 보 겠 습 니 다. 키워드 가 정의 하 는 의뢰 유형 은 무엇 을 했 습 니까?앞의 주제 에서 저 는 여러분 에 게 의뢰 는 하나의 유형 이 라 고 말 했 습 니 다.이렇게 근거 가 있 습 니 다.왜냐하면 저희 가 IDE 에서 의뢰 유형 을 정의 할 때 최종 적 으로 컴 파일 러 를 통 해 정 의 된 코드 를 중간 언어 IL 로 바 꾼 다음 에 중간 언어 중의 코드 를 실행 하여 본 컴퓨터 코드 로 바 꾸 었 기 때 문 입 니 다.그래서 Visual Studio 에서 작 성 된 코드 는 포장 일 뿐 입 니 다.실제 프로그램 은 중간 언어 에 있 는 코드 를 실행 합 니 다.이제 컴 파일 러 가 우리 가 정의 한 의뢰 유형 을 어떤 중간 언어 코드 로 바 꾸 는 지 살 펴 보 자.
우리 가 클래스 에서 아래 와 같이 의뢰 를 정의 할 때:
public delegate void DelegateTest(int parm);
컴 파 일 러 는 우리 가 정의 한 의뢰 유형 을 다음 과 같은 종류 로 컴 파일 합 니 다.
Public class DelegateTest: System.MulticastDelegate
{
public DelegateTest(Object object, IntPtr method);
public virtual Void Invoke(int32 parm);
public virtual IAsyncResult BeginInvoke(Int32 parm, AsyncCallback callback, Object object );
public virtual void EndInvoke(IAsyncResult result);
}
중간 언어의 코드 를 통 해 알 수 있 듯 이 우리 가 코드 에 쓴 의뢰 는 중간 언어 에 있어 하나의 유형 이다.FCL 에서 정 의 된 Systme.MulticastDelegate 유형 을 계승 하고 모든 의뢰 유형 은 MulticastDelegate 에서 파생 되 었 다.이 유형 은 네 가지 방법,구조 함수,Invoke 방법 도 정의 했다.그리고 두 가지 비동기 방법 인 BeginInvoke 와 EndInvoke 방법 입 니 다.이 두 가지 비동기 방법 에 대해 여러분 은 제 블 로그 의 스 레 드 시 리 즈 를 보 실 수 있 습 니 다.여러분 은 ILDasm.exe 도구 로 의뢰 생 성 된 중간 코드 를 볼 수 있 습 니 다.아래 에 제 가 캡 처 한 그림 입 니 다.모든 의뢰 유형 은 MulticastDelegate 에 계승 되 고 MulticastDelegate 는 Delegate 에 계승 되 기 때문에 의뢰 유형 은 MulticastDelegate 의 필드,속성 과 방법 을 계승 합 니 다.이 구성원 들 중 세 개의 비공 식 필드 가 뒤에 소개 할 의뢰 체인 과 관련 이 있 기 때문에 여기 서 먼저 열거 한 것 입 니 다.
필드
유형
해명 하 다.
_target
System.Object
의뢰 대상 이 정적 인 방법 으로 포장 되 었 을 때 이 필드 는 null 입 니 다.의뢰 대상 이 인 스 턴 스 방법 을 포장 할 때 이 필드 는 방법 이 있 는 클래스 의 대상 을 참조 합 니 다.
_methodPtr
System.IntPtr
내부 의 정 수 는 방법 문형 이 라 고 볼 수 있 고 호출 할 방법 을 표시 하고 있다.
_invocationList
System.Object
이 필드 는 보통 null 입 니 다.의뢰 체인(멀티캐스트 의뢰)을 구성 할 때 의뢰 배열 을 참조 합 니 다.구체 적 인 다음 부분 설명.
대부분의 사람들 이 이런 의문 을 가 질 수 있 습 니 다.비 공공 필드 이기 때문에 MSDN 에 서 는 볼 수 없습니다.그러면 이 세 필드 가 있 는 지 어떻게 알 았 습 니까?Reflector 도 구 를 통 해 원본 코드,Multicastdelegate 를 역 컴 파일 할 수 있 습 니 다. 클래스 는 MSDN 을 통 해 이러한 네 임 스페이스 와 프로그램 집합 을 찾 을 수 있 습 니 다.그러면 프로그램 집합 과 네 임 스페이스 는 Reflector 도구 로 Multicastdelegate 류 의 소스 코드 를 볼 수 있 습 니 다.다음은 제 가 Reflector 라 는 도구 로 볼 수 있 는 소스 코드 캡 처 입 니 다.
캡 처 에서 MulticastDelegate 를 볼 수 있 습 니 다. 클래스 에는 두 필드 만 있 지만 앞 표 에 열 거 된 가 없습니다.methodPtr 와target 필드 의 두 필드 는 Delegate 클래스 에 정의 되 어 있 습 니 다.Reflector 도 구 를 사용 하여 볼 수 있 습 니 다.여기에 구체 적 인 스티커 가 없습니다.마지막 으로 Reflector 도 구 를 사용 하여 링크 를 다운로드 할 것 입 니 다.
의뢰 대상 은 하나의 포장 기 입 니 다.하나의 방법 과 이 방법 을 호출 할 때 조작 해 야 할 대상 입 니 다.예 를 들 어 아래 코드 를 실행 할 때:
public class Program
{
// ,
// int , void
public delegate void DelegateTest(int parm);
public static void Main(string[] args)
{
//
DelegateTest dtstatic = new DelegateTest(Program.method1);
//
DelegateTest dtinstance = new DelegateTest(new Program().method2);
}
private static void method1(int parm)
{
Console.WriteLine(" , :" + parm);
}
private void method2(int parm)
{
Console.WriteLine(" , :" + parm);
}
}
코드 에서 dtstatic 과 dtinstance 변 수 는 초기 화 된 Delegatest 의뢰 대상 을 참조 합 니 다.이때 이 두 의뢰 대상 의 위 에 열 거 된 세 필드 의 초기 화 상황 은 다음 그림 과 같 습 니 다.총화
본 주 제 는 중간 언어의 측면 에서 정 의 된 의뢰 유형 이 컴 파 일 러 를 통 해 전 환 된 중간 언어 가 의뢰 유형 을 어떻게 해석 하 는 지 상세 하 게 해석 하고 얻 은 결론 은 의뢰 는 실제 적 으로 하나의 유형 이다.이런 유형 은 MulticastDelegate 류 에서 태 어 났 고 이런 종류의 를 계승 했다 는 것 이다.target,_methodPtr 와invocationList 라 는 세 필드 는 우리 가 의뢰 대상 을 초기 화 할 때 이 세 필드 를 초기 화 합 니 다.포장 인 스 턴 스 방법 과 정적 방법 에 대한 의뢰 는 이 세 필드 를 초기 화 하 는 것 도 다 릅 니 다.위의 캡 처 에서 도 나타 납 니 다.여기 서 중요 한 필드 인― 를 참조 하 였 습 니 다.invocationList(즉,인 스 턴 스 호출 목록),의뢰 대상 에 게 하나의 방법 을 포장 할 때 이 필드 는 null 입 니 다.의뢰 대상 이 여러 가지 방법 을 포장 하려 고 할 때invocationList 필드 는 의뢰 대상 을 인용 하 는 배열(의뢰 대상 을 가리 키 는 집합)로 초기 화 됩 니 다.구체 적 인 내용 은 다음 주제 소개 의뢰 체인 에서 자세히 소개 합 니 다.여기까지 본 주제 의 내용 도 끝 났 습 니 다.본 주 제 를 통 해 여러분 들 은 C\#중의 의뢰 를 더욱 깊이 이해 할 수 있 기 를 바 랍 니 다.
Reflector 도구 다운로드 주소:이전 주제보고 도움 이 된다 면 많이 추천 해 주세요.응원 해 주 셔 서 감사합니다.
이상 은 c\#의뢰 의 본질 이 무엇 인지 에 대한 상세 한 내용 입 니 다.c\#의뢰 의 본질 에 관 한 자 료 는 다른 관련 글 에 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.