当前位置: 首页 > java >正文

【C#补全计划】委托

一、委托的概念

1. 委托使函数(方法)的容器

2. 可以理解为表示函数(方法)的变量类型

3. 用来存储、传递函数(方法)

4. 委托的本质是一个类,用来定义函数(方法)的类型(返回值和参数的类型)

5. 不同的函数(方法)必须对应各自“格式”一致的委托

二、委托的语法

1. 关键字:delegate

2. 语法:访问修饰符 delegate 返回值 委托名(参数列表);

3. 位置:声明在namespace或class中(在namespace中更常用)

4. 不写访问修饰符默认为public,在其他命名空间也能使用。若使用private则不能在其他命名空间使用

三、创建自定义委托

using System;namespace Delegate
{class Program{static void Main(string[] args){}}// 声明一个存储无参无返回值函数的容器:这里只定义了规则,并没有使用public delegate void MyDelegate();// 声明一个存储有参无返回值函数的容器public delegate void MyDelegate2(int a, int b);// 声明一个存储无参有返回值函数的容器public delegate int MyDelegate3();// 声明一个存储有参有返回值函数的容器public delegate int MyDelegate4(int a, int b);
}

四、使用委托

1. 委托常用在:

        (1)作为类的成员

        (2)作为函数的参数

2. 代码

using System;namespace Delegate
{class Program{static void Main(string[] args){// 委托的初始化MyDelegate md1 = new MyDelegate(fun);// 第二种方式MyDelegate md2 = fun;// 委托的使用md1.Invoke();// 第二种方式md2();Console.WriteLine("---------------------");Test t = new Test();t.testFun(fun, atk); // 传递方法}static void fun(){Console.WriteLine("调用fun()");}static void atk(int atk, int def){Console.WriteLine("造成" + (atk - def) + "点伤害");}}// 声明一个存储无参无返回值函数的容器:这里只定义了规则,并没有使用public delegate void MyDelegate();// 声明一个存储有参无返回值函数的容器public delegate void MyDelegate2(int a, int b);// 声明一个存储无参有返回值函数的容器public delegate int MyDelegate3();// 声明一个存储有参有返回值函数的容器public delegate int MyDelegate4(int a, int b);class Test{private MyDelegate fun1;private MyDelegate2 fun2;public void testFun(MyDelegate f1, MyDelegate2 f2){int atk = 3; // 假设这是攻击力int def = 1; // 假设这是防御力// 先处理一些别的逻辑 当这些逻辑处理完了 再执行传入的函数atk *= 2; // 攻击力翻倍def += 2; // 防御力加2f1();f2(atk, def);}}
}

运行结果如下:

五、多播委托

1. 概念:委托变量可以存储多个函数

2. 代码:

using System;namespace Delegate
{class Program{static void Main(string[] args){// 委托的初始化MyDelegate md1 = new MyDelegate(fun);// 第二种方式MyDelegate md2 = fun;// 委托的使用md1.Invoke();// 第二种方式md2();Console.WriteLine("---------------------");Test t = new Test();t.testFun(fun, atk); // 传递方法Console.WriteLine("---------------------");// 多播委托MyDelegate md3 = fun;md3();Console.WriteLine("添加2个函数后:");md3 += fun; // += 向委托md3中添加函数md3 += fun2;md3();Console.WriteLine("删除1个fun()后:");md3 -= fun; // -= 在委托md3中移除函数md3();md3 = null; // 清空委托}static void fun(){Console.WriteLine("调用fun()");}static void fun2(){Console.WriteLine("调用fun2()");}static void atk(int atk, int def){Console.WriteLine("造成" + (atk - def) + "点伤害");}}// 声明一个存储无参无返回值函数的容器:这里只定义了规则,并没有使用public delegate void MyDelegate();// 声明一个存储有参无返回值函数的容器public delegate void MyDelegate2(int a, int b);// 声明一个存储无参有返回值函数的容器public delegate int MyDelegate3();// 声明一个存储有参有返回值函数的容器public delegate int MyDelegate4(int a, int b);class Test{private MyDelegate fun1;private MyDelegate2 fun2;public void testFun(MyDelegate f1, MyDelegate2 f2){int atk = 3; // 假设这是攻击力int def = 1; // 假设这是防御力// 先处理一些别的逻辑 当这些逻辑处理完了 再执行传入的函数atk *= 2; // 攻击力翻倍def += 2; // 防御力加2f1();f2(atk, def);}}
}

运行结果如下:

六、系统定义的委托

1. 前提:引用System命名空间

2. Action:无返回值的委托

3. Func:有返回值的委托

4. 代码:

using System;namespace Delegate
{class Program{static void Main(string[] args){// 委托的初始化MyDelegate md1 = new MyDelegate(fun);// 第二种方式MyDelegate md2 = fun;// 委托的使用md1.Invoke();// 第二种方式md2();Console.WriteLine("---------------------");Test t = new Test();t.testFun(fun, atk); // 传递方法Console.WriteLine("---------------------");// 多播委托MyDelegate md3 = fun;md3();Console.WriteLine("--添加2个函数后:--");md3 += fun; // += 向委托md3中添加函数md3 += fun2;md3();Console.WriteLine("--删除1个fun()后:--");md3 -= fun; // -= 在委托md3中移除函数md3();md3 = null; // 清空委托Console.WriteLine("---------------------");// 使用系统定义的委托// Action:无返回值的委托Action a = fun; // 无参无返回值a();Action<int, int> a2 = atk; // 有参无返回值a2(3, 2);// Func:有返回值的委托Func<int> f1 = fun3; // 无参有返回值int x = f1();Func<int, int, string> f2 = fun4; // 有参有返回值,最后一个泛型为返回值string s = f2(0, 0);}static void fun(){Console.WriteLine("调用fun()");}static void fun2(){Console.WriteLine("调用fun2()");}static int fun3(){Console.WriteLine("调用fun3()");return 0;}static string fun4(int a, int b){Console.WriteLine("调用fun4()");return "";}static void atk(int atk, int def){Console.WriteLine("造成" + (atk - def) + "点伤害");}}// 声明一个存储无参无返回值函数的容器:这里只定义了规则,并没有使用public delegate void MyDelegate();// 声明一个存储有参无返回值函数的容器public delegate void MyDelegate2(int a, int b);// 声明一个存储无参有返回值函数的容器public delegate int MyDelegate3();// 声明一个存储有参有返回值函数的容器public delegate int MyDelegate4(int a, int b);class Test{private MyDelegate fun1;private MyDelegate2 fun2;public void testFun(MyDelegate f1, MyDelegate2 f2){int atk = 3; // 假设这是攻击力int def = 1; // 假设这是防御力// 先处理一些别的逻辑 当这些逻辑处理完了 再执行传入的函数atk *= 2; // 攻击力翻倍def += 2; // 防御力加2f1();f2(atk, def);}}
}

        今天的学习就到这里了。感谢阅读。

        再见!

http://www.xdnf.cn/news/17913.html

相关文章:

  • uniapp 开发微信小程序,获取经纬度并且转化详细地址(单独封装版本)
  • 零基础-动手学深度学习-10.4. Bahdanau 注意力
  • 电脑上练打字用什么软件最好:10款打字软件评测
  • 【学习笔记】Java并发编程的艺术——第10章 Executor框架
  • VUE3 学习笔记2 computed、watch、生命周期、hooks、其他组合式API
  • RecyclerView 性能优化:从原理到实践的深度优化方案
  • 2020 GPT3 原文 Language Models are Few-Shot Learners 精选注解
  • JVM 总览与运行原理:深入Java虚拟机的核心引擎
  • 快速学会什么是gPRC
  • mysql-DDLy语句案例
  • Linux 系统中网络管理
  • vue3 wangeditor5 编辑器,使用方法
  • 高并发场景下限流算法对比与实践指南
  • 【递归、搜索与回溯算法】DFS解决FloodFill算法
  • whisper 语种检测学习笔记
  • 39 C++ STL模板库8-容器1-array
  • 解决hexo deploy报错:fatal: bad config line 1 in file .git/config
  • 跨网络 SSH 访问:借助 cpolar 内网穿透服务实现手机远程管理 Linux
  • 图像识别控制技术(Sikuli)深度解析:原理、应用与商业化前景
  • Vue 组件二次封装透传slots、refs、attrs、listeners
  • 把 AI 装进“冰箱贴”——基于超低功耗语音合成的小屏电子价签
  • StringBoot-SSE和WebFlux方式消息实时推送-默认单向-可增加交互接口
  • C语言中的输入输出函数:构建程序交互的基石
  • 开源数据发现平台:Amundsen Frontend Service 应用程序配置
  • 基于CodeBuddy的2D游戏开发实践:炫酷大便超人核心机制解析
  • NOI Online培训1至26期例题解析(16-20期)
  • week1-[一维数组]传送
  • MySQLl中OFFSET 的使用方法
  • PIDGenRc函数中lpstrRpc的由来和InitializePidVariables函数的关系
  • JMeter性能测试详细版(适合0基础小白学习--非常详细)