LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

快速掌握C#中的委托和事件

admin
2025年10月19日 2:8 本文热度 98

定义

委托:是一个,它定义了方法签名(返回类型和方法参数),能够获取匹配它方法签名的任何方法的引用,本质是一个类型安全的函数指针

事件:是类成员(可以当成一个字段),是委托的封装

定义语法如下:

//修饰符 delegate 返回类型  委托名称(参数列表)public delegate void MyDelegate(string message);
//修饰符 event 委托类型  事件名称public event MyDelegate MyEvent;


为什么需要委托

  1. 解决“方法作为参数的需求”(回调机制)

  2. 解耦调用方和被调用方,不再依赖具体方法名

  3. 支持事件驱动编程(为事件奠基)

  4. 启用函数式编程范式(高阶函数)

  5. 简化异步和并发编程

 

举例场景

根据用户输入*,-,*,/实现一个计算方法

不使用委托代码如下:
  public int Calcute(string type,int x,int y)  {      int res = 0;      switch (type)      {          case "+":              res = Add(x, y);              break;          case "-":              res = Sub(x, y);              break;          case "*":              res = Mul(x, y);              break;          case "/":              res = Div(x, y);              break;          default:              break;
      }
      return res;  }     public int Add(int x,int y) {     return x + y; }
 public int Sub(int x ,int y) {     return x - y; }
 public int Mul(int x ,int y) {     return x * y; }
 public int Div(int x,int y) {     return x / y; }
如果后面还有别的计算逻辑,还要添加方法和判断
使用委托代码如下:
  public delegate int CalculDelegate(int x, int y);
  public int CalcaulByDelegate(int x,int y,CalculDelegate calculDelegate)  {      int res = 0;      if (calculDelegate != null)      {          res=calculDelegate(x, y);      }      return res;  }    public int CalcuteTest(string type, int x, int y)  {      int res = 0;      switch (type)      {          case "+":              res = CalcaulByDelegate(x,y,(a,b)=>a+b);              break;          case "-":              res = CalcaulByDelegate(x, y, (a, b) => a - b);              break;          case "*":              res = CalcaulByDelegate(x, y, (a, b) => a * b);              break;          case "/":              res = CalcaulByDelegate(x, y, (a, b) => a / b);              break;          default:              break;
      }
      return res;  }
通过使用事件,实现动态插入自定义方法,代码灵活性、复用性更高


为什么使用事件

实现安全的发布——订阅的通知机制,事件只能做订阅和取消订阅操作且不会干扰其他订阅者。而任何的委托拥有者都可以覆盖和移除委托方法,会对其他委托拥有者造成干扰,是不安全的。


常用泛型委托

  • 无返回类型的泛型委托Action

    最多包含16个参数

// 无参数Action printHello = () => Console.WriteLine("Hello");printHello();// 带参数Action<string> printMessage = msg => Console.WriteLine(msg);printMessage("泛型委托示例");

  • 有返回值类型的泛型委托Func

    最多包含16个参数

    // 输入 int,返回 stringFunc<intstring> intToString = num => num.ToString();string result = intToString(42); // 返回 "42"// 多个参数(int, int 输入,bool 返回)Func<intintbool> isEqual = (a, b) => a == b;bool check = isEqual(1010); // true


实际应用场景

  1. 集合操作

    List<int> data = new List<int> { 123 };// 使用 Func 转换元素var squared = data.ConvertAll(x => x * x); // [1, 4, 9]

2.回调方法

void ProcessData<T>(T data, Action<T> callback) {    // 处理数据...    callback(data);}// 调用ProcessData(42, result => Console.WriteLine($"结果: {result}"));

3.事件处理

// 泛型事件委托public event Action<string> LogEvent;
// 触发事件LogEvent?.Invoke("事件已触发");


小结

泛型委托(如 ActionFunc)是 C# 中实现回调、事件处理和 LINQ 的核心机制。它们通过泛型提供类型安全和灵活性,显著提升代码的可维护性和复用性。掌握泛型委托能有效简化复杂逻辑的设计。


阅读原文:原文链接


该文章在 2025/10/20 10:24:30 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved