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

事件和委托,Lambda表达式

首先记住最基本的概念:

委托,其实就是方法的引用。

事件是基于委托的。事件允许一个对象(发布者)通知其他对象(订阅者)发生了某个动作。

委托示例

// 定义一个委托类型,它可以引用返回值为 void,且参数为两个 int 类型的方法
public delegate void MathOperation(int x, int y);

// 定义一个与委托匹配的方法
public static void Add(int x, int y)
{
    Console.WriteLine($"Sum: {x + y}");
}

// 定义另一个匹配的减法方法
public static void Subtract(int x, int y)
{
    Console.WriteLine($"Difference: {x - y}");
}

public static void Main(string[] args)
{
    // 创建一个委托实例,指向 Add 方法
    MathOperation op = Add;
    op(10, 20); // 输出: Sum: 30

    // 将委托指向 Subtract 方法
    op = Subtract;
    op(20, 10); // 输出: Difference: 10
}

事件示例:

// 定义一个委托
public delegate void NotifyEventHandler(string message);

// 定义一个发布者类,包含事件
public class Publisher
{
    // 声明一个事件
    public event NotifyEventHandler Notify;

    public void DoSomething()
    {
        // 做一些事情后触发事件
        Notify?.Invoke("任务完成!");
    }
}

// 定义一个订阅者类
public class Subscriber
{
    // 订阅事件的处理程序
    public void OnNotify(string message)
    {
        Console.WriteLine($"收到通知:{message}");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        // 创建发布者和订阅者
        Publisher publisher = new Publisher();
        Subscriber subscriber = new Subscriber();

        // 订阅事件
        publisher.Notify += subscriber.OnNotify;

        // 执行发布者操作,触发事件
        publisher.DoSomething(); // 输出: 收到通知:任务完成!
    }
}

Invoke 是用于调用委托的方法。当你使用 Invoke 方法时,实际上是在执行委托所引用的方法。

event 关键字用于定义事件,它封装了委托,不允许在外部直接调用,只能由定义事件的类触发。即Notify?.Invoke("任务完成!"); 是在Publisher发布者类内

发布者定义并触发事件,订阅者通过委托订阅事件。

Lambda 表达式是一种简洁的匿名方法写法,可以用来定义内联方法或传递给委托和事件处理器。

格式:(parameters) => expression

基本的 Lambda 表达式:

// 使用 Lambda 表达式来定义一个委托
Func<int, int, int> add = (x, y) => x + y;

Console.WriteLine(add(10, 20)); // 输出: 30

Func<int, int, int> 是一个内置委托类型,表示一个接受两个 int 参数并返回一个 int 值的方法。Lambda 表达式 (x, y) => x + y 是方法的具体实现。

与委托结合的 Lambda 表达式
// 定义一个委托
public delegate void PrintOperation(string message);

// 使用 Lambda 表达式
PrintOperation print = message => Console.WriteLine(message);
print("Hello, Lambda!"); // 输出: Hello, Lambda!

FUNC和ACTION型委托,它们都用于简化委托的使用

  Func 委托

  • 功能:用于表示一个具有返回值的方法。Func 委托可以有最多 16 个参数和一个返回值。
    Func<参数1类型, 参数2类型, ..., 返回值类型> 例如:
    Func<int, int, int> add = (a, b) => a + b;
    int result = add(3, 4);  // result 为 7
    

  • Func 示例
    // 定义一个 Func 委托,接受两个整数参数并返回一个整数
    Func<int, int, int> multiply = (x, y) => x * y;
    int product = multiply(5, 6);  // product 为 30
    

  • Action 委托

  • 功能:用于表示一个没有返回值的方法。Action 委托可以有最多 16 个参数,但不返回值。
Action<参数1类型, 参数2类型, ...> 例如:
Action<string> printMessage = message => Console.WriteLine(message);
printMessage("Hello, World!");  // 输出: Hello, World!
Action 示例
// 定义一个 Action 委托,接受一个字符串参数并不返回值
Action<string> greet = name => Console.WriteLine($"Hello, {name}!");
greet("Alice");  // 输出: Hello, Alice!


http://www.kler.cn/news/305358.html

相关文章:

  • python之pyecharts制作可视化数据大屏
  • Git 回滚详解:应对各种场景的策略
  • Java 21的Concurrency的笔记
  • 【架构设计模式-1】代理模式
  • 物品识别——基于python语言
  • python深拷贝和浅拷贝的实验
  • python学习第八节:爬虫的初级理解
  • 远程跨境传输大文件如何做到安全又稳定?
  • 使用Selenium进行网页自动化
  • 水平垂直居中的几种方法(总结)
  • 【浅谈】单片机基本概念
  • 在WPF中使用矢量图标
  • 【ArcGISProSDK】初识
  • Vue Router push方法的使用
  • vm虚拟机中ubuntu连不上网络,网络图标消失解决办法
  • 技术成神之路:设计模式(十三)访问者模式
  • 2.1 溪降技术:溪降运动的定义
  • 链路层和交换网_计算机网络
  • vue+el-table 可输入表格使用上下键进行input框切换
  • Qt常用控件——QSpinBox
  • STM32的寄存器深度解析
  • Mysql的高级查询:SQL关联查询(内连接/外连接/自连接)/子查询
  • uni-app和Node.js使用uni-push2.0实现通知栏消息推送功能
  • Centos挂载和删除nfs
  • python选择排序算法
  • 基于Java+Mysql实现(web)大型企业管理系统
  • API安全测试 | Postman + BurpSuite 配置证书代理
  • chapter14-集合——(List)——day17
  • 828华为云征文|部署在线文件管理器 Spacedrive
  • 大数据-132 - Flink SQL 基本介绍 与 HelloWorld案例