导入
委托
学习如何声明、实例化和调用委托,以将方法作为参数传递并动态执行它们。
...
Delegates can reference methods
代码示例
1delegate void MessagePrinter();
...
Decomposition of delegate declaration
...
Delegate usage illustration
1// 声明一个委托类型的变量,并使其指向一个方法 2MessagePrinter printer = new MessagePrinter(PrintHelloWorld); 3 4// 不使用构造函数,可以直接用方法指针初始化 5MessagePrinter printer2 = PrintHelloWorld; 6 7// 添加另一个方法,使委托指向它 8printer += PrintGoodBye; 9printer2 += PrintGoodBye; 10 11// 调用委托 12printer(); 13 14// 另一种调用委托的方式 15printer2.Invoke(); 16 17// 返回 void 且不接受任何参数 18void PrintHelloWorld() 19{ 20 Console.WriteLine("Hello World!"); 21} 22 23// 返回 void 且不接受任何参数 24void PrintGoodBye() 25{ 26 Console.WriteLine("Good bye!"); 27} 28 29// 返回 void 且不接受任何参数 30delegate void MessagePrinter();
1namespace Delegates; 2 3public class Dog 4{ 5 public string Name { get; set; } 6 7 public Dog(string name) 8 { 9 Name = name; 10 } 11 12 public void Bark() 13 { 14 Console.WriteLine($"{Name} says bark! bark!"); 15 } 16}
1using Delegates; 2 3// 创建 Dog 类的实例 4Dog dog = new Dog("Roxie"); 5Dog dog2 = new Dog("Buzz"); 6 7// 绑定方法 8MessagePrinter printer = dog.Bark; 9printer += dog2.Bark; 10 11// 调用委托 12printer(); 13 14delegate void MessagePrinter();
1// 创建同类型的委托 2MessagePrinter printer1 = SurroundWithHyphens; 3MessagePrinter printer2 = SurroundWithStars; 4MessagePrinter printer3 = SurroundWithStars; 5 6// 合并委托 7MessagePrinter printer4 = printer1 + printer2 + printer3; 8 9// 调用委托 10printer4("Hello World!"); 11 12void SurroundWithStars(string message) 13{ 14 Console.WriteLine($"***{message}***"); 15} 16 17void SurroundWithHyphens(string message) 18{ 19 Console.WriteLine($"---{message}---"); 20} 21 22delegate void MessagePrinter(string message);
1MessagePrinter printer = SurroundWithHyphens; 2printer += SurroundWithStars; 3 4MethodInvoker(printer, "some message"); 5 6void MethodInvoker(MessagePrinter printerDelegate, string message) 7{ 8 // 使用空条件运算符防止委托为 null 时引发异常 9 printerDelegate?.Invoke(message); 10} 11 12void SurroundWithStars(string message) 13{ 14 Console.WriteLine($"***{message}***"); 15} 16 17void SurroundWithHyphens(string message) 18{ 19 Console.WriteLine($"---{message}---"); 20} 21 22delegate void MessagePrinter(string message);
1// 实例化泛型委托 2MathOperator<int, long> op1 = Adder; 3MathOperator<int, double> op2 = Divider; 4 5long sum = op1(5, 6); 6double divisionResult = op2(7, 2); 7 8Console.WriteLine(sum); 9Console.WriteLine(divisionResult); 10 11long Adder(int firstNumber, int secondNumber) 12{ 13 return firstNumber + secondNumber; 14} 15 16double Divider(int firstNumber, int secondNumber) 17{ 18 return (double)firstNumber / secondNumber; 19} 20 21// 泛型委托 22delegate T2 MathOperator<T1, T2>(T1 operand1, T1 operand2);