English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
함수를 매개변수로 전달하려면 어떻게 해야 하나요? C#은 호출백 함수나 이벤트 처리기를 어떻게 처리하나요? 답은-대리자(delegate)。대리자(Delegate)는 특정 메서드에 대한 참조를 가진 참조형 변수입니다. 참조는 실행 시간에 변경될 수 있습니다.
대리자는메서드 서명 정의의 참조형 데이터 타입. 대리자의 변수를 정의할 수 있습니다. 이 변수는 대리자와 같은 서명을 가진 어떤 메서드도 참조할 수 있습니다.
대리자와 함께 작업할 때는 세 단계가 필요합니다:
대리자 선언
목표 메서드 설정
대리자 호출
delegate 키워드와 함수 서명을 사용하여 대리자를 선언할 수 있습니다. 예를 들어 다음과 같이 선언할 수 있습니다.
대리자 문법
[접근자 Modifier] delegate [반환형] [대리자 이름]([파라미터们])
아래는 MyDelegate라는 대리자를 선언한 예입니다.
public delegate void MyDelegate(string msg);
위에서는 MyDelegate를 선언했습니다.
대리자를 선언한 후, 우리는 목표 메서드나 lambda 표현식을 설정해야 합니다. 우리는 new 키워드를 사용하여 대리자 객체를 생성하고 그 서명이 대리자 서명과 일치하는 메서드를 전달하여 이를 구현할 수 있습니다.
public delegate void MyDelegate(string msg); // 대리자 선언 //목표 메서드 설정 MyDelegate del = new MyDelegate(MethodA); // 或者 MyDelegate del = MethodA; // 또는 lambda 표현식 MyDelegate del = (string msg) => Console.WriteLine(msg); // 目标方法 static void MethodA(string message) { Console.WriteLine(message); }
您可以通过直接分配方法来设置目标方法,而无需创建委托的对象,例如MyDelegate del = MethodA。
设置目标方法后,可以使用 Invoke()方法或使用()运算符来调用委托。
del.Invoke("Hello World!"); //或者 del("Hello World!");
以下是委托的完整示例。
public delegate void MyDelegate(string msg); //대리자 선언 class Program { static void Main(string[] args) { MyDelegate del = ClassA.MethodA; del("Hello World"); del = ClassB.MethodB; del("Hello World"); del = (string msg) => Console.WriteLine("Called lambda expression: " + msg); del("Hello World"); } } class ClassA { static void MethodA(string message) { Console.WriteLine("Called ClassA.MethodA() with parameter: " + message); } } class ClassB { static void MethodB(string message) { Console.WriteLine("Called ClassB.MethodB() with parameter: " + message); } }
下图说明了委托。
方法可以具有委托类型的参数,如下所示。
public delegate void MyDelegate(string msg); //대리자 선언 class Program { static void Main(string[] args) { MyDelegate del = ClassA.MethodA; InvokeDelegate(del); del = ClassB.MethodB; InvokeDelegate(del); del = (string msg) => Console.WriteLine("Called lambda expression: " + msg); InvokeDelegate(del); } static void InvokeDelegate(MyDelegate del) // MyDelegate类型参数 { del("Hello World"); } } class ClassA { static void MethodA(string message) { Console.WriteLine("Called ClassA.MethodA() with parameter: " + message); } } class ClassB { static void MethodB(string message) { Console.WriteLine("Called ClassB.MethodB() with parameter: " + message); } }
在.NET中,Func和Action类型是内置的泛型委托,应该用于最常见的委托,而不是创建新的自定义委托。
委托可以指向多个方法。指向多个方法的委托称为多播委托。“+” 또는 “+=”运算符将函数添加到调用列表中,而“-”和“-=”运算符将其删除。
public delegate void MyDelegate(string msg); //宣声明委托 class Program { static void Main(string[] args) { MyDelegate del1 = ClassA.MethodA; MyDelegate del2 = ClassB.MethodB; MyDelegate del = del1 + del2; // del1 + del2 del("Hello World"); MyDelegate del3 = (string msg) => Console.WriteLine("Called lambda expression: " + msg); del += del3; // del1 + del2 + del3 del("Hello World"); del = del - del2; // 移除 del2 del("Hello World"); del -= del1 // 移除 del1 del("Hello World"); } } class ClassA { static void MethodA(string message) { Console.WriteLine("Called ClassA.MethodA() with parameter: " + message); } } class ClassB { static void MethodB(string message) { Console.WriteLine("Called ClassB.MethodB() with parameter: " + message); } }
덧셈과 뺄셈 연산자는 항상 대입의 일부로 작동합니다:del1+=del2; del1=del1+del2완전히 동일합니다;빼기도 마찬가지입니다.
대리자가 값을 반환하는 경우, 그룹 대리자 호출 시 마지막으로 할당된 대상 메서드의 값을 반환합니다.
public delegate int MyDelegate(); //대리자 선언 class Program { static void Main(string[] args) { MyDelegate del1 = ClassA.MethodA; MyDelegate del2 = ClassB.MethodB; MyDelegate del = del1 + del2; Console.WriteLine(del());// 반환200 } } class ClassA { static int MethodA() { return 100; } } class ClassB { static int MethodB() { return 200; } }
대리자와 동일한 방식으로 모범형 대리자를 정의할 수 있지만, 모범형 type 매개변수나 반환형을 사용할 수 있습니다. 대상 메서드를 설정할 때는 반드시 모범형 타입을 지정해야 합니다.
예를 들어, int와 string 파라미터를 가진 일반 대리자를 보겠습니다.
public delegate T add<T>(T param1, T param2; // 모범형 대리자 class Program { static void Main(string[] args) { add<int> sum = Sum; Console.WriteLine(sum(10, 20)); add<string> con = Concat; Console.WriteLine(conct("Hello ", "World!!")); } public static int Sum(int val1, int val2) { return val1 + val2; } public static string Concat(string str1, string str2) { return str1 + str2; } }
대리자는 이벤트와 익명 메서드를 선언에도 사용됩니다.
대리자는 정의된签名을 가진 참조형 데이터 타입입니다.
대리자 타입 변수는 동일한签名을 가진 모든 메서드를 참조할 수 있습니다.
문법:[접근수식자]대리자[반환형] [대리자이름]([파라미터])([access modifier] delegate [return type] [delegate name]([parameters]))
목표 메서드의 서명은 대리자 서명과 일치해야 합니다。
대리자는 일반 함수나 invoke() 메서드와 같이 호출될 수 있습니다。
사용할 수 있습니다 “ +” 또는 “ + == 연산자를 통해 여러 메서드를 대리자에 할당하고, “-” 또는 “-== 연산자를 통해 제거됩니다. 이는 다중CAST대리자라고 합니다。
다중CAST委托가 값을 반환하면, 그 값은 마지막으로 할당된 목표 메서드에서 반환됩니다。
대리자는 C#에서 이벤트와 익명 메서드를 선언하는 데 사용됩니다。