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

20250606-C#知识:委托和事件

C#知识:委托和事件

使用委托可以很方便地调用多个方法,也方便将方法作为参数进行传递


1、委托

  • 委托是方法的容器
  • 委托可以看作一种特殊的类
  • 先定义委托类,再用委托类声明委托变量,委托变量可以存储方法
delegate int Calculate(int a, int b);
Calculate calculate;
calculate = Add;
calculate(5, 3);
  • 委托可以存储多个方法
calculate = Add;
calculate += Sub;
calculate += Mul;
  • 委托必须先赋值,然后使用+=添加方法或使用-=删除方法
  • 删除方法,可以随机删除方法
calculate -= Add;
calculate(5, 3);
//清空
calculate = null;
  • 委托可以有泛型
delegate T CalculatePlus<T>(T a, T b);
CalculatePlus<int> calculatePlus;
calculatePlus = Add;
calculatePlus(6, 2);
  • 系统提供了两种委托Action和Func
  • 系统提供的委托支持泛型,一般够用
  • 无返回值Action
Action<string> myAction = Speak;
myAction.Invoke("Sleep is fine");
  • 有返回值Func,最后一个泛型参数为返回类型
Func<float, int, string> myFunc = Move;
myFunc(100, 6);

2、事件

  • 青春迷你版委托(受限制的委托)
  • 创建委托变量时在前面加上event关键字
public event Action<string> myEvent;
  • 与委托相比,不能在创建事件变量的类外赋值和调用
  • 使用事件更安全
  • 事件只能作为成员存在于类、接口和结构体中
class TestEvent
{public Action<string> myDelegate;public event Action<string> myEvent;public void InitializeEvent(){myEvent = null;}
}
TestEvent testEvent = new TestEvent();
//testEvent.myEvent = Speak;    //报错
testEvent.myDelegate = Speak;testEvent.InitializeEvent();
testEvent.myEvent += Speak;//testEvent.myEvent("歪比巴卜");    //报错
testEvent.myDelegate("Ohhhhhhhhhh no!");

3、完整代码示例

namespace LearnDelegateAndEvent
{delegate int Calculate(int a, int b);delegate T CalculatePlus<T>(T a, T b);class TestEvent{public Action<string> myDelegate;public event Action<string> myEvent;public void InitializeEvent(){myEvent = null;}}internal class Program{static int Add(int a, int b){int result = a + b;Console.WriteLine($"ADD:{result}");return result;}static int Sub(int a, int b){int result = a - b;Console.WriteLine($"SUB:{result}");return a - b;}static int Mul(int a, int b){int result = a * b;Console.WriteLine($"MUL:{result}");return a * b;}static void Speak(string word){Console.WriteLine($"I want to say {word}");}static string Move(float speed, int seconds){string result = $"Move:{speed * seconds}";Console.WriteLine(result);return result;}static void Main(string[] args){//委托按照添加顺序执行方法Calculate calculate;//添加方法calculate = Add;calculate += Sub;calculate += Mul;calculate(1, 2);//删除方法,可以随机删除方法calculate -= Add;calculate(5, 3);calculate = null;//泛型委托CalculatePlus<int> calculatePlus;calculatePlus = Add;calculatePlus(6, 2);//系统委托Action<string> myAction = Speak;myAction.Invoke("Sleep is fine");//有返回值,最后一个泛型参数为返回类型Func<float, int, string> myFunc = Move;myFunc(100, 6);Console.WriteLine("==========================");//事件TestEvent testEvent = new TestEvent();//testEvent.myEvent = Speak;    //报错testEvent.myDelegate = Speak;testEvent.InitializeEvent();testEvent.myEvent += Speak;//testEvent.myEvent("歪比巴卜");    //报错testEvent.myDelegate("Ohhhhhhhhhh no!");}}
}

输出:

ADD:3
SUB:-1
MUL:2
SUB:2
MUL:15
ADD:8
I want to say Sleep is fine
Move:600
==========================
I want to say Ohhhhhhhhhh no!

4、参考资料

  1. 《唐老狮C#》

本文结束,感谢您的阅读~

在这里插入图片描述

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

相关文章:

  • 企业引入数字孪生,优化决策,提升市场竞争力的秘诀
  • 缓存一致性的形式化定义
  • UVM环境打印如何显示时间单位
  • 仿射变换、根据特征点进行仿射变换
  • HarmonyOS运动开发:如何用mpchart绘制运动配速图表
  • 计算与分析2-深度学习
  • F5 – TCP 连接管理:会话、池级和节点级操作
  • 嵌入式Linux下如何启动和使用Docker
  • 【数据结构】图
  • FPGA 动态重构配置流程
  • CVAT标注服务
  • 中国移动6周年!
  • C++.OpenGL (10/64)基础光照(Basic Lighting)
  • 2025年6月6日15:48:23
  • [蓝桥杯]防御力
  • Source insight 4自用技巧整理
  • webstorm 配置 Prettier
  • 每次clone都会有:Enter passphrase for key ‘/Users/xxx/.ssh/id_rsa‘:
  • JavaScript操作数组、字符串、对象的一些方法
  • vcs仿真产生fsdb波形的两种方式
  • YOLO训练保持原有识别能力
  • maven私服
  • JAVA元编程
  • QPS、TPS、RT、IOQS、并发数等性能名词介绍
  • AI系统提示词:V0
  • C++.OpenGL (9/64)摄像机(Camera)
  • UChart图标 y轴取整
  • [蓝桥杯]扫地机器人
  • 如何在Lyra中创建一个新的Game Feature Plugin和Experience游戏体验
  • 区分viewmodel和model职责的方法