Intern Day83

为什么引入委托

C#委托最最简单的说法:委托的作用是用来传方法的。

一般的方法/函数只能用来传参数,当需要方法作为参数传递的时候,需要引入 委托

委托规则

  1. 委托和所要传的方法的返回值类型要一致。

  2. C#中定义委托用 delegate 关键字。

  3. 对于一个委托类型,可以创建它的实例,并使这个实例指向一个具体的方法。而这个方法的签名(无论方法具体完成什么功能)必须要与委托类型的定义一致。

  4. c#用委托来实现事件通知机制。相当与c++函数指针。

委托的基本实现见下面代码。

委托的多播

委托支持多播。

多播就是同一个委托实例可以指向多个方法,只要调用这个实例,所有方法就会按顺序执行。要向一个委托实例添加方法用 += ,要移除(多个)方法用 -=

委托的多播的基本代码的实现见下面,都写在一起了,便于比较着来看。

定义委托的方法

  1. 一般定义

  2. 匿名方法

  3. Lambda表达式

具体见下面代码

具体代码

using System;
using System.Diagnostics;
using System.Net.NetworkInformation;
using System.Reflection;
using System.Security.Cryptography;

namespace Practice1 // namespace 索引器
{
    public class DelegateTest
   {
       public int Add(int x, int y) // int Add(int x, int y
       {
           Console.WriteLine($"{nameof(Add)}:{x}+{y}={x+y}"); 
           // 使用 nameof 操作符来获得名字字符串。(即接收元素值返回元素名)
           // ${}:包裹一个变量或表达式
           return x + y; // 不写return会报错
       }
       
       public int Subtract(int x, int y) 
       {
           Console.WriteLine($"{nameof(Subtract)}:{x}-{y}={x-y}");
           return x - y;
       }
       
       public int Multiply(int x, int y) 
       {
           Console.WriteLine($"{nameof(Multiply)}:{x}*{y}={x*y}");
           return x * y;
       }
       
       // Divide
   }
    
    // 定义一个委托类型
   public delegate int Cal(int x, int y);
   
   class Program
   {
       static void Main(string[] args)
       {
           var test = new DelegateTest();
      
           // 定义三个委托实例Cal,指向不同的方法
           Cal add = new Cal(test.Add);
           Cal sub = new Cal(test.Subtract);
           Cal mul = new Cal(test.Multiply);
           
           // ---------------------------------------------------------------------
           
           // 上面add用下面这个代替,就是用 匿名方法 来实现委托实例
           /*
           Cal add = delegate(int x, int y)
           {
               Console.WriteLine($"{nameof(Add)}:{x}+{y}={x+y}");
               return x + y; 
           };
           */
           
           // 上面add用下面这个代替,就是用 Lambda表达式 来实现委托实例
           /*
           Cal add = (int x, int y) =>
           {
               Console.WriteLine($"{nameof(Add)}:{x}+{y}={x+y}");
               return x + y; 
           };
           */
           
           // ---------------------------------------------------------------------
           
           // 执行委托
           int resultAdd = add(5,3);
           int resultSubtract = sub(5,3);
           int resultMultiply = mul(5,3);
           
           // Console.ReadKey(); // 读取一个字符 不管输多少,只读一个字符结束
           // Console.Read(); // 读取一行 输入多少都会读取然后结束
           Console.ReadLine(); // 读取一行+回车 输入多少都会读取然后再读取到一个回车才结束
           
           // ---------------------------------------------------------------------
           
           // 委托的多播
           Cal cal = new Cal(test.Add); 
           cal += test.Subtract;
           cal += test.Multiply; 
           // 注意!并不是ans=(ans+x-y)*z连着加减乘,而是每一步都是分开计算的
           int ans = cal(5,3);
           Console.WriteLine(ans);
       }
   }
}

输出:

Add:5+3=8
Subtract:5-3=2
Multiply:5*3=15
k
Add:5+3=8
Subtract:5-3=2
Multiply:5*3=15
15 //解释:如果委托类型的定义中具有返回值,那么多播委托执行后的返回值是最后一个方法的返回值,所以ans就是Multiply方法的返回值。

参考

公众号 .NET之窗 的文章:《C#中的委托与事件》(关于项目中如何使用可以看看,目前我没用到)

原文地址:https://www.cnblogs.com/OFSHK/p/14755499.html