>  기사  >  백엔드 개발  >  C# 대리자(Delegate) 사용에 대한 자세한 설명

C# 대리자(Delegate) 사용에 대한 자세한 설명

黄舟
黄舟원래의
2016-12-13 13:34:141441검색

1. 위임이란 무엇인가요?

사실 위임을 어떻게 하면 더 자세히 설명할 수 있을까 고민을 많이 했는데요. 솔직히 말해서 문제를 다른 각도에서 바라보기 때문에 사람마다 의견이 다릅니다. 개인적으로는 다음 두 가지 점으로 이해하면 될 것 같습니다.

(1) 데이터 구조상 위임은 클래스와 마찬가지로 사용자 정의형입니다.

(2) 디자인 패턴 측면에서 위임(클래스)은 메소드(객체)의 추상화를 제공합니다.

델리게이트는 유형이므로 어떤 데이터를 저장하나요?

대리자는 메서드의 추상화이며 동일한 서명과 반환 유형을 가진 일련의 메서드 주소를 저장한다는 것을 알고 있습니다. 대리자가 호출되면 대리자에 포함된 모든 메서드가 실행됩니다.

2. 델리게이트 유형 정의

클래스가 유형인 것처럼 델리게이트도 유형입니다. 클래스와 마찬가지로 대리자 형식은 변수 및 형식 개체를 만드는 데 사용되기 전에 선언되어야 합니다.

delegate void MyDel(int x);

위임 유형 선언:

(1) 위임 키워드로 시작합니다.

(2) 반환 유형 + 위임 유형 이름 + 매개변수 목록.

delegate void MyDel(int x);

3. 대리자 변수 선언

MyDel del1,del2;

4. 대리자 변수 초기화

(1) new 연산자 사용

new 연산자 ~의 메서드는 인스턴스 메서드이거나 정적 메서드일 수 있습니다.

(2) 메서드 지정자만으로 구성된 단축 구문

단축 구문을 사용합니다. 이는 메서드 이름과 해당 대리자 형식 간에 암시적인 변환이 있기 때문에 작동합니다.
del1 = new MyDel( myInstObj.MyM1 );
del2 = new MyDel( SClass.OtherM2 );

5. 대리자 할당

대리자는 참조 유형이므로 값을 할당하여 대리자 변수에 포함된 메서드 주소 참조를 변경할 수 있습니다. 이전 참조는 가비지 수집기에 의해 회수됩니다.
del1 = myInstObj.MyM1;
del2 = SClass.OtherM2;

6. 대의원 결합

추가 연산자를 사용하여 대의원을 합칠 수 있습니다. 이 작업은 궁극적으로 두 피연산자의 대리인 호출 목록 복사본을 연결한 호출 목록을 갖는 새 대리인을 생성합니다.
MyDel del;
del = myInstaObj.MyM1; //委托初始化del = SClass.OtherM2;//委托重新赋值,旧的引用将被回收

대리자는 상수이며 피연산자 대리자는 생성된 후에 변경되지 않습니다. 대리자 조합은 피연산자의 복사본을 복사합니다.

7. 대리자 추가 및 빼기

+= 연산자를 사용하여 대리자에 새 메서드를 추가할 수 있습니다.
MyDel del1 = myObj.MyMethod;
MyDel del2 = SClass.OtherM2;
MyDel del3 = del1 + del2;   //组合调用列表

-= 연산자를 사용하여 대리자에서 메서드를 제거할 수도 있습니다.

8. 위임 호출

위임 호출은 메소드 호출과 유사합니다. 대리자가 호출된 후 호출 목록의 각 메서드가 실행됩니다.
MyDel del = myObj.MyMethod;
del += SClass.OtherM2; // 增加方法
del -= myObj.MyMethod; // 移除方法

대리인을 호출하기 전에 대리인이 비어 있는지 확인해야 합니다. 빈 대리자를 호출하면 예외가 발생합니다.

9. 익명 메서드

익명 메서드는 대리자를 초기화할 때 인라인으로 선언된 메서드입니다.
if(null != del)
{
     del();//委托调用
     }

기본 구조:

예:

deleage( 参数 ) { 语句块 }
위에서 우리는 익명 메서드가 선언된 반환 값을 표시하지 않는다는 것을 알 수 있습니다.

delegate int MyDel (int x); //定义一个委托 

MyDel del = delegate( int x){ return x; };

10.람다식

Lambda表达式主要用来简化匿名方法的语法。在匿名方法中,delegate关键字有点多余,因为编译器已经知道我们将方法赋值给委托。通过几个简单步骤,我们就可以将匿名方法转换为Lambda表达式:

删除delegate关键字

在参数列表和匿名方法主体之间防Lambda运算符=>。Lambda运算符读作"goes to"。

MyDel del = delegate( int x) { return x; };//匿名方法
MyDel del2 = (int x) => {return x;};//Lambda表达式
MyDel del3 = x => {return x};//简写的Lambda表达式


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.