C# delegate,Action,Func,Event 使用

news/2024/11/29 5:40:13/

文章目录

  • 1. delegate 委托
  • 2. Event 事件
  • 3. Action 无返回值委托
  • 4. Func 带返回值委托

1. delegate 委托

作用:
(1)将方法当作参数传递
(2)方法的一种多态(类似于一个方法模板,可以匹配很多个方法)
(3)声明:访问修饰符 delegate 返回值类型 委托名(参数列表)
(4)添加和移除:+=,-=

public class DelegateTest : MonoBehaviour
{public delegate int MyDelegate(int x, int y);public delegate void MyVoidDelegate(int x);// 与委托匹配的一个方法public int Add(int a, int b) {return a + b;}// 与委托匹配的另一个方法public int Reduce(int a, int b){return a - b;}// 示例:将委托当参数传递public int Test(MyDelegate md, int a, int b){return md(a, b);}public void Method1(int a){Debug.Log($"a={a}");}public void Method2(int b){Debug.Log($"b={b}");}void Start(){/*** 一般用法 ***/// MyDelegate md = new MyDelegate(Add);  // 第一种种初始化方式MyDelegate md;                           // 第二种种初始化方式md = Add;int resultA = md(2, 3);md = Reduce;int resultB = md(5, 4);int resultC = Test(md, 4, 4); // 传的是 Reduce 方法Debug.Log($"{resultA}, {resultB}, {resultC}"); // 打印: 5, 1, 0/*** 多播 ***/MyVoidDelegate md1 = null;md1 += Method1;md1 += Method2;md1(12);    // 打印: a=12 b=12/*** 有返回值的多播问题 ***/MyDelegate md2 = null;md2 += Add;md2 += Reduce;int resultD = md2(1, 1);  Debug.Log(resultD); // 打印: 0(只返回最后一个方法的返回值)}
}

2. Event 事件

(1)事件 event 是一种具有特殊签名的委托
(2)添加和移除:+=,-=
(3)访问修饰符 event 委托类型 事件名

public class DelegateTest : MonoBehaviour
{public delegate void MyVoidDelegate(int x);public event MyVoidDelegate myEvent;public void Method1(int a){Debug.Log($"a={a}");}public void Method2(int b){Debug.Log($"b={b}");}void Start(){myEvent = Method1;myEvent += Method2;myEvent += (int c) => {Debug.Log($"c={c}");};myEvent(10);    // 打印:a=10 b=10 c=10}
}

3. Action 无返回值委托

可带参,无返回值委托

public class DelegateTest : MonoBehaviour
{public void Method1(int a){Debug.Log($"a={a}");}void Start(){Action<int> action;action = (int a) => {Debug.Log(a);};action += Method1;action(10); // 打印:10 a=10}
}

4. Func 带返回值委托

public class DelegateTest : MonoBehaviour
{public void Method1(int a){Debug.Log($"a={a}");}void Start(){Func<int, int, int> func = null;   // 带两个 int 参数,返回一个 int 参数func += (int a, int b) => a + b;int result = func(1, 2);Debug.Log(result);  // 打印:3}
}

http://www.ppmy.cn/news/957389.html

相关文章

python 笔记:you-get

下载视频/音乐/图片 使用pip安装you-get pip3 install you-get 之后在命令行执行下载操作 1 主要命令行参数 -n --no-merge 如果视频分p&#xff0c;不进行合并--no-caption不下载弹幕、歌词等 -f --force 覆盖已存在的文件 -F STREAM_ID --format STREAM_ID 指定视频下载…

【产品设计】通用后台管理系统需求及原型设计

后台管理系统&#xff0c;会根据不同公司、不同业务的要求做出改变。 网上很多系统的参考多数为业务中台&#xff0c;过于带有业务色彩。做过三四个后台管理系统&#xff0c;从中总结了一个通用的功能和需求设计模版&#xff0c;供大家参考。本文适用于0-2岁的产品经理做基础功…

JS-26 认识防抖和节流函数;自定义防抖、节流函数;自定义深拷贝、事件总线函数

目录 1_防抖和节流1.1_认识防抖和节流函数1.2_认识防抖debounce函数1.3_防抖函数的案例1.4_认识节流throttle函数 2_Underscore实现防抖和节流2.1_Underscore实现防抖和节流2.2_自定义防抖函数2.3_自定义节流函数 3_自定义深拷贝函数4_自定义事件总线 1_防抖和节流 1.1_认识防…

实现将redis中的所有数据备份到数据库表中

实现将redis中的所有数据备份到数据库表中 /*** 将redis中的数据同步到mysql中*/Overridepublic void saveMysqlForRedis(){Jedis jedis new Jedis("127.0.0.1", 6379);//System.out.println(jedis.ping());Set keys jedis.keys("*");//列出所有的keyI…

Win10环境下Android Studio中运行Flutter HelloWorld项目

一、引言 Android Studio是Android的官方IDE(Integrated Development Environment)。它专为Android而打造&#xff0c;可以加快开发速度&#xff0c;为Android设备构建最高品质的应用。 Flutter是Google推出并开源的移动应用开发框架&#xff0c;主打跨平台、高保真、高性能。开…

一分钟带你了解什么是ChatGPT?

在实际应用场景中&#xff0c;ChatGPT可以应用于多种场景&#xff0c;如客服、娱乐和教育等。与传统的聊天机器人相比&#xff0c;ChatGPT具有更高的智能水平&#xff0c;能够更好地理解人类的语言和意图。比如&#xff0c;ChatGPT可以帮助用户解决一些常见的问题&#xff0c;如…

chatGPT的原理是什么

ChatGPT是一种基于自然语言生成的对话系统。它使用了一种叫做 Transformer 的神经网络架构&#xff0c;能够从输入的文本中学习语言模型并生成输出文本。 ChatGPT 的工作原理是&#xff0c;当用户输入一条消息时&#xff0c;它会将输入的消息与之前的对话历史拼接起来&#xff…

如何使用chatgpt提高嵌入式软件开发效率

使用CHATGPT可以提高软件的开发效率 注册 这个过程网上很多&#xff0c;可从网上参考 输入要实现的软件功能&#xff0c;尽量的分模块获取软件的源码&#xff0c; 将最终输出的源码信息拷贝到项目中&#xff0c;前提一定要读懂软件源码的功能&#xff0c;且懂得调用接口。