Delegate 에 대해 자세히 이야기 하 다 (1)

의뢰 를 표시 합 니 다. 의뢰 는 데이터 구조 로 정적 방법 이나 인 스 턴 스 및 이러한 인 스 턴 스 방법 을 참조 합 니 다.
[SerializableAttribute] 
[ClassInterfaceAttribute(ClassInterfaceType.AutoDual)] 
[ComVisibleAttribute(true)] 
public abstract class Delegate : ICloneable, ISerializable

Delegate 류 는 위탁 유형의 기본 클래스 입 니 다.그러나 시스템 과 컴 파일 러 만 Delegate 류 나 MulticastDelegate 류 에서 명시 적 으로 파생 될 수 있다.위탁 유형 에서 새로운 유형 을 파생 시 키 는 것 도 허용 되 지 않 는 다.Delegate 류 는 의뢰 유형 이 아니 라 파생 의뢰 유형 에 사 용 됩 니 다.
대부분의 언어 는 delegate 키 워드 를 실현 하 는데 이런 언어의 컴 파일 러 는 MulticastDelegate 류 에서 파생 될 수 있다.따라서 사용 자 는 언어 가 제공 하 는 delegate 키 워드 를 사용 해 야 합 니 다.
위탁 유형의 성명 은 하나의 협정 을 맺 었 고, 이 협정 은 하나 이상 의 방법의 서명 을 지정 했다.의뢰 는 다음 과 같은 내용 을 참조 하 는 의뢰 유형 을 가 진 인 스 턴 스 입 니 다.
  • 특정한 유형의 인 스 턴 스 방법 과 이 유형의 목표 대상 에 게 배분 할 수 있 습 니 다.
  • 특정한 유형의 인 스 턴 스 방법 (형 참 표 에 공 개 된 숨겨 진 this 매개 변수 포함).이 의뢰 를 개방 식 실례 의뢰 라 고 한다.
  • 정적 방법.
  • 정적 방법 과 이 방법 에 분 배 될 수 있 는 첫 번 째 매개 변수의 목표 대상.이 의뢰 는 첫 번 째 매개 변 수 를 통 해 닫 는 것 이 라 고 합 니 다.

  • 의뢰 가 첫 번 째 매개 변 수 를 통 해 닫 는 인 스 턴 스 방법 (가장 흔 한 경우) 을 표시 할 때 이 방법의 입구 점 에 대한 인용 과 대칭 을 목표 로 하 는 대상 (이 대상 은 이 방법 을 정의 할 수 있 는 유형 이 있 음) 에 대한 인용 을 저장 합 니 다.의뢰 가 개방 식 인 스 턴 스 방법 을 표시 할 때 이 방법 입구 점 에 대한 인용 을 저장 합 니 다.서명 을 의뢰 하려 면 폼 에 숨겨 진 this 인 자 를 포함해 야 합 니 다.이 경우 의뢰 는 목표 대상 에 대한 인용 이 없 으 며, 의뢰 를 호출 할 때 목표 대상 을 제공 해 야 한다.
    의뢰 가 정적 방법 을 표시 할 때, 의뢰 는 이 방법의 입구 점 에 대한 인용 을 저장 합 니 다.의뢰 가 첫 번 째 매개 변 수 를 통 해 닫 는 정적 방법 을 표시 할 때 이 방법 입구 점 에 대한 참조 와 대상 (이 대상 이 방법 첫 번 째 매개 변수 에 할당 할 수 있 는 유형) 에 대한 인용 을 저장 합 니 다.이 의뢰 를 호출 할 때 정적 방법의 첫 번 째 매개 변 수 는 대상 을 받 습 니 다.
    의뢰 의 호출 목록 은 정렬 된 의뢰 집합 입 니 다. 그 중에서 목록 의 모든 요 소 는 이 의뢰 가 표시 하 는 방법 을 잘 호출 합 니 다.호출 목록 은 중복 되 는 방법 을 포함 할 수 있 습 니 다.호출 기간 에 호출 목록 에 나타 나 는 순서대로 호출 합 니 다.호출 목록 의 모든 방법 을 호출 하려 고 의뢰 하 였 으 며, 중복 방법 은 호출 목록 에 한 번 나타 나 면 한 번 호출 합 니 다.의뢰 는 가 변 적 이지 않다;만 들 면 의뢰 한 호출 목록 을 변경 할 수 없습니다.
    의뢰 는 다 중 방송 의뢰 또는 조합 의뢰 라 고 불 린 다. 의뢰 는 한 가지 또는 여러 가지 방법 을 호출 할 수 있 고 조합 작업 에 사용 할 수 있 기 때문이다.
    병합 작업 (예 를 들 어 Combine 과 Remove) 은 기 존 의뢰 를 바 꾸 지 않 습 니 다.반면, 이러한 작업 은 작업 결과, 변경 되 지 않 은 의뢰 또는 빈 인용 (Visual Basic 에서 Nothing) 을 포함 하 는 새로운 의뢰 를 되 돌려 줍 니 다.병합 작업 의 결과 가 어떠한 방법의 의뢰 도 인용 하지 않 았 을 때 이 작업 은 빈 인용 으로 되 돌아 갑 니 다 (Visual Basic 에서 Nothing).요청 한 작업 이 잘못 되 었 을 때, 병합 작업 은 변경 되 지 않 은 의뢰 를 되 돌려 줍 니 다.
    호출 된 방법 이 이상 을 일 으 키 면 방법 은 실행 을 중단 하고 이상 을 의뢰 한 호출 자 에 게 전달 하 며 호출 목록 의 나머지 방법 을 호출 하지 않 습 니 다.호출 자의 이상 을 포착 하 는 것 은 이 행 위 를 바 꾸 지 않 습 니 다.
    호출 된 방법의 서명 이 반환 값 을 포함 할 때 호출 목록 의 마지막 요소 의 반환 값 을 되 돌려 줍 니 다.서명 이 전 달 된 매개 변 수 를 포함 할 때 이 매개 변수의 최종 값 은 목록 의 모든 방법 을 호출 한 결과 입 니 다. 이 방법 들 은 순서대로 실행 되 고 매개 변수의 값 을 업데이트 합 니 다.
    컴 파일 러 는 의뢰 에 두 가지 다른 방법 을 제공 합 니 다: BeginInvoke 와 EndInvoke.이러한 방법 에 대한 더 많은 정 보 는 '비동기 방식 으로 동기 화 방법 을 호출 하 는 것' 을 참조 하 시기 바 랍 니 다.
    C 나 C + + 에서 의뢰 와 가장 비슷 한 것 은 함수 포인터 입 니 다.의뢰 는 정적 방법 이나 실례 방법 을 나 타 낼 수 있다.의뢰 가 인 스 턴 스 방법 을 표시 할 때 의뢰 는 방법 입구 점 에 대한 인용 뿐만 아니 라 클래스 인 스 턴 스 에 대한 인용 도 저장 합 니 다.함수 포인터 와 달리 의뢰 는 대상 과 유형 을 대상 으로 안전 합 니 다.
    using System;
    public class SamplesDelegate  {
    
       // Declares a delegate for a method that takes in an int and returns a String.
       public delegate String myMethodDelegate( int myInt );
    
       // Defines some methods to which the delegate can point.
       public class mySampleClass  {
    
          // Defines an instance method.
          public String myStringMethod ( int myInt )  {
             if ( myInt > 0 )
                return( "positive" );
             if ( myInt < 0 )
                return( "negative" );
             return ( "zero" );
          }
    
          // Defines a static method.
          public static String mySignMethod ( int myInt )  {
             if ( myInt > 0 )
                return( "+" );
             if ( myInt < 0 )
                return( "-" );
             return ( "" );
          }
       }
    
       public static void Main()  {
    
          // Creates one delegate for each method.
          mySampleClass mySC = new mySampleClass();
          myMethodDelegate myD1 = new myMethodDelegate( mySC.myStringMethod );
          myMethodDelegate myD2 = new myMethodDelegate( mySampleClass.mySignMethod );
    
          // Invokes the delegates.
          Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 5, myD1( 5 ), myD2( 5 ) );
          Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", -3, myD1( -3 ), myD2( -3 ) );
          Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 0, myD1( 0 ), myD2( 0 ) );
       }
    
    }
    
    

     

    좋은 웹페이지 즐겨찾기