대리자 유형의 의미는 참조 유형의 서문에 소개되었습니다(보려면 클릭하세요). 즉, 대리자 유형을 사용하면 해당 메소드를 다른 메소드의 매개변수로 전달할 수 있습니다. . 직설적으로 말하자면, 메소드는 매개변수로 전달될 수 있습니다. 모든 대리자(Delegate)는 System.Delegate 클래스에서 파생됩니다.
(이해가 안가는 것 같네요.) 룸메이트 HC555는 LoL 매니아이고 타오바오 쇼핑을 좋아하는데, LoL에 푹 빠져 있을 때 택배기사님이 택배로 전화를 주셨어요. 배달, 게임할 때 제일 귀찮은 게 이거라서 택배를 돌려달라고 하더군요. 이때 룸메이트를 (룸프렌드)급으로 간주하고 택배를 받는 것도 학원에서의 방법입니다. 클래스(takepackage())이고 Delegate(메서드를 전달할 수 있는 객체)에 의해 인스턴스화된 객체이며, 룸메이트로부터 빠른 배송을 받는 메소드를 "운반"합니다.
대리자 선언:
대리자의 선언에 따라 대리자가 참조할 수 있는 메서드가 결정됩니다. 대리자는 동일한 레이블이 있는 메서드를 가리킬 수 있습니다.
예를 들어 다음과 같이 대리자를 선언합니다.
public delegate int MyDelegate(string str); //string类型的变量就是它的标签
위 대리자는 단일 문자열 매개변수를 사용하고 int 유형 변수를 반환하는 모든 메서드를 참조하는 데 사용할 수 있습니다.
대리자 인스턴스화:
대리자는 메서드의 형식입니다. 대리자 형식이 선언되면 새 개체를 사용하여 대리자 개체를 만들어야 합니다. 키워드로, 특정 메소드와 관련된 새로운 키워드로 생성되어야 합니다. 대리자를 만들 때 메서드는 매개 변수 없이 변수로 새 문에 전달됩니다. 예:
public delegate int MyDelegate(string str); //委托的声明 ..... public static int Add(string s); //定义的一个方法 ..... MyDelegate my = new MyDelegate(Add) ; //实例化一个委托,其实就是实例化一个对象
코드 예:
특급 배송을 픽업하는 원래 스토리로 돌아가서 이 스토리를 코드로 변환했습니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { public delegate void MyDelegate(string str); //委托的声明 class roomfriend //定义室友这个类 { public static void takepackage(string name) //定义一个取快递的方法 { Console.WriteLine("我叫 {0} 这是一个取快递方法",name); } } class program { static void Main(string[] args) { MyDelegate myd = new MyDelegate(roomfriend.takepackage); //实例化一个委托“我”携带一个方法(将方法当参数传入) myd("HC555"); //由我实现室友的方法,实际是室友的方法当参数传给了我 } } }
결과는 이렇습니다.
택배를 받고 기숙사로 돌아오는데 룸메이트가 전화해서 말하더군요. 배가 고프다며 슈퍼마켓을 지나갈 때 먹을 것을 사오라고 하더군요. 레이펑의 정신으로 동의했는데... 여기서 '뭔가를 사는 것'도 룸프렌드에서는 수단으로 볼 수 있고, '나'도 마찬가지입니다. 그의 방법에서 또 다른 것을 "운반"합니다. C#에서는 "+="를 사용하여 병합 메서드를 순차적으로 연결하고, 호출 시 순차적으로 출력해 보셨나요? 아직... 0.0)
위에서는 "를 사용합니다. +=" 메소드를 연결합니다. 메소드를 취소하려면 자연스럽게 "-="를 사용하여 "I"와의 연결을 취소할 수 있습니다. 관계를 유지하므로 위 코드에서는 myd -= roomfriend 만 추가하면 됩니다. .takepackage // express를 취하는 메소드가 다시 호출되지 않도록 += 아래에 넣습니다.
슈퍼마켓에서 비스킷 몇 상자를 샀는데 또 룸메이트의 전화가 울렸다. 그 사람은 그 소포가 여자 친구를 위한 것이라고 말하며 나에게 배달해 달라고 요청했다. 예전에는 좋은 사람들이 그걸 고수할 텐데 나도 동의했어요. . 여자친구에게 택배를 배달할 때, 그녀는 급해서 비스킷 상자를 포함한 내 모든 물건을 서둘러 가져갔습니다. . 그리고는 웃으며 행복하게 기숙사로 돌아왔습니다... 여기서는 수락(accept) 메소드를 갖는 또 다른 (여자친구) 클래스를 정의하고, 메소드의 매개변수로 나(delegate)를 사용합니다. > 정의 방법: public static void accept(string name,MyDelegate pack); 위임을 상자로 생각하면 이 상자는 동일한 유형의 매개 변수를 가진 메서드로 가득 차 있습니다. MyDelegate pack을 문자열 이름과 비교해 보면 name은 문자열 유형의 변수이고, pack은 MyDelegate 유형의 변수라고 할 수 있습니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { public delegate void MyDelegate(string str); //委托的声明 class roomfriend //定义室友这个类 { public static void takepackage(string name) //定义一个取快递的方法 { Console.WriteLine("我叫 {0} 这是一个取快递方法",name); } public static void shopping(string name) //定义一个买东西的方法 { Console.WriteLine("我叫 {0} 这是一个买东西的方法",name); } } class program { static void Main(string[] args) { MyDelegate myd = new MyDelegate(roomfriend.takepackage); //实例化一个委托“我”携带一个方法(将方法当参数传入) myd += roomfriend.shopping; // += 合并运算顺序执行方法 myd("HC555"); } } }결과는 같습니다
반성:
위에서 제시한 예에서는 "룸메이트" 또는 "룸메이트의 여자친구"가 클래스로 간주됩니다. 메소드를 호출할 때 메소드 이름을 사용하고, 인스턴스화된 객체를 사용하는 경우 객체 이름을 전달합니다. . 대리자에 전달할 메소드 이름 참조 메소드:
roomfriend myfriend = new roomfriend(); // 룸메이트를 객체로 인스턴스화
MyDelegate myd = new MyDelegate(myfriend.tackpackage ; 코드에서 takepackage를 Public 액세스로 선언했지만 여전히 private 필드로 컴파일되는 것으로 나타났습니다. 이는 메서드를 정의할 때 사용한 정적 항목과 관련이 있습니다(제거된 경우 자세히 설명). 가능합니다.
위는 C# 학습일기 19의 내용입니다.---참조형 위임(Delegate)형에 대한 자세한 내용은 PHP 중국어 홈페이지(www. php.cn)!