C# (X):委托

委托(delegate)

  1. 委托是函数指针的升级版
  2. 一切皆地址
    • 变量(数据)是以某个地址为起点的一段内存中所储存的值
    • 函数(算法)是以某个地址为起点的一段内存中所储存的一组机器语言指令
  3. 直接调用和间接调用
    • 直接调用:通过函数名称来调用函数,CPU通过函数名直接获得函数所在的地址并开始执行→返回
    • 间接调用:通过函数指针来调用函数,CPU通过读取函数指针存储的值获得函数所在地址并开始执行→返回
  4. Java中没有与委托相对应的功能实体
  5. 委托的简单使用
    • Action委托
    • Func委托
 class Program
    {
      static void Main(string[] args)
        {
   
            Calculator calculator = new Calculator();
            Action action = new Action(calculator.Report);
            action.Invoke();
            action();//指针式写法
            Func<int, int, int> func1 = new Func<int, int, int>(calculator.Add);
            Func<int, int, int> func2 = new Func<int, int, int>(calculator.Sub);
            int x = 100;
            int y = 200;
            int z = 0;
            z = func1.Invoke(x, y);
            z = func1(x, y);//指针式写法
            Console.WriteLine(z);
            z = func2.Invoke(x, y);
            z = func2(x, y);//指针式写法
            Console.WriteLine(z);
        }
    }   
}
class Calculator
{
   
    public void Report()
    {
   
        Console.WriteLine("I have 3 methods.");
    }
    public int Add(int a ,int b)
    {
   
        int result=a+b;
        return result;
       
    }

    public int Sub(int a, int b)
    {
   
        int result = a -  b;
        return result;

    }

委托的声明(自定义委托)

  1. 委托也是一种类,类是一种数据类型,所以委托也是一种数据类型
  2. 其声明方式和一般的类不同,主要是为了照顾可读性和C/C++传统
  3. 注意声明委托的位置
  4. 委托与所封装的方法必须“类型兼容”(返回值的数据类型,参数列表的个数和数据类型)
namespace ConsoleApp1
{
   
    public delegate int Calc(int x, int y);//委托声明,注意要和Program类同级
    class Program
    {
      static void Main(string[] args)
        {
   
            Calculator calculator = new Calculator();
            Calc calc1 = new Calc(calculator.Add);
            Calc calc2 = new Calc(calculator.Sub);
            Calc calc3 = new Calc(calculator.Mul);
            Calc calc4 = new Calc(calculator.Div);

            int  a = 100;
            int b = 90;
            int c;
            c = calc1.Invoke(a, b);
            Console.WriteLine(c);
            c = calc2.Invoke(a, b);
            Console.WriteLine(c);
            c = calc3.Invoke(a, b);
            Console.WriteLine(c);
            c = calc4.Invoke(a, b);
            Console.WriteLine(c);
        }
    }   
}
class 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值