c#委托和事件

目录

委托

1,什么是委托

2,委托的定义

3,使用委托

4,委托的多播

事件

1,什么是事件

2,事件的定义

3,订阅和触发事件

4,事件的访问控制

5,事件的多播


委托

1,什么是委托

委托是一个函数指针,可以存储方法的引用,并且能够在运行时调用这些方法。委托允许将方法作为参数传递,或将方法作为返回值返回

2,委托的定义

例:

// 定义一个委托

public delegate void MyDelegate(string message);

这个委托MyDelegate表示可以接受一个string类型的参数且没有返回值的方法

3,使用委托

定义委托后,可以通过它来引用和调用方法

例:

复制代码
// 一个普通的方法,符合委托签名
public void DisplayMessage(string message)
{

    Console.WriteLine(message);

}



public void Example()
{

    // 创建委托实例并绑定到方法
    MyDelegate myDelegate = new MyDelegate(DisplayMessage);

    

    // 调用委托,实际上是调用 DisplayMessage 方法
    myDelegate("Hello, Delegate!");

}

输出

Hello,Delegate!

也可以使用匿名方法或lamba表达式来创建委托

例:

MyDelegate myDelegate = (message) => Console.WriteLine(message);

myDelegate("Hello from Lambda!");

4,委托的多播

委托是可以多播的,即一个委托实例可以同时调用多个方法,可以使用+操作符将多个方法添加到同一个委托实例中

例:

复制代码
public void AnotherMethod(string message)
{

    Console.WriteLine("Another: " + message);

}



public void ExampleMulticast()
{

    MyDelegate myDelegate = DisplayMessage;

    myDelegate += AnotherMethod;  // 添加方法



    myDelegate("Hello, Multicast!");  // 调用时会依次调用 DisplayMessage 和 AnotherMethod

}

输出

Hello,Multicast!

Another:Hello,Multicast!

事件

1,什么是事件

事件是基于委托的一个特殊机制,用于实现发布/订阅模式,当某个条件发生时,事件会通知到所有订阅者。事件是对委托的一种封装,提供了更加安全和规范的方式来处理回调

2,事件的定义

事件是委托时高级封装,通常由类或结构体声明并用于通知外部对象发生了某些行为或状态变化

例:

复制代码
public class MyEventPublisher
{

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

    

    // 声明一个事件
    public event MyEventHandler MyEvent;

    

    // 触发事件的方法
    public void TriggerEvent(string message)
    {

        if (MyEvent != null)
        {

            MyEvent(message);  // 调用所有订阅者的方法

        }

    }

}

3,订阅和触发事件

事件必须由外部代码订阅,当事件发生时,发布者会通知所有订阅者

例:

复制代码
public class MyEventListener
{

    public void OnEventTriggered(string message)
    {

        Console.WriteLine("Event Triggered: " + message);

    }

}



public void ExampleEvent()
{

    MyEventPublisher publisher = new MyEventPublisher();

    MyEventListener listener = new MyEventListener();



    // 订阅事件
    publisher.MyEvent += listener.OnEventTriggered;

    

    // 触发事件
    publisher.TriggerEvent("Hello, Event!");

}

输出

Event Triggered: Hello, Event!

上面的listener的OnEventTriggered方法订阅了事件MyEvent,当MyEvent事件被触发时(也就是调用TriggerEvent方法时),所有被订阅的方法都会收到通知,执行对应操作

4,事件的访问控制

事件通常用Event关键字定义,并且其委托可以被限制为只能添加或删除事件处理程序,外部代码不能直接触发事件,只能通过+=和-=操作符来订阅和退订事件

例:

public event MyEventHandler MyEvent;

public void Example()

{

// 订阅事件

MyEvent += DisplayMessage;

// 触发事件的代码由事件的发布者控制

// 不允许外部代码直接调用 MyEvent();

}

5,事件的多播

类似委托,事件也可以多播,这意味着你可以将多个事件处理程序添加到一个事件上,当事件被触发时,所有订阅的处理程序都会依次调用

例:

复制代码
public void AnotherHandler(string message)
{

    Console.WriteLine("Another Handler: " + message);

}



public void ExampleMulticastEvent()
{

    MyEventPublisher publisher = new MyEventPublisher();

    

    // 订阅多个处理程序
    publisher.MyEvent += DisplayMessage;

    publisher.MyEvent += AnotherHandler;

    

    // 触发事件时会依次调用两个处理程序
    publisher.TriggerEvent("Multicast Event Triggered!");

}

输出

Event Triggered: Multicast Event Triggered!

Another: Multicast Event Triggered!

相关推荐
★YUI★12 小时前
学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)8.17
java·学习·游戏·unity·c#
谷宇.12 小时前
【Unity3D实例-功能-拔枪】角色拔枪(二)分割上身和下身
游戏·unity·c#·游戏程序·unity3d·游戏开发·游戏编程
LZQqqqqo13 小时前
C# 中 ArrayList动态数组、List<T>列表与 Dictionary<T Key, T Value>字典的深度对比
windows·c#·list
Dm_dotnet15 小时前
Stylet启动机制详解:从Bootstrap到View显示
c#
三千道应用题17 小时前
WPF&C#超市管理系统(6)订单详情、顾客注册、商品销售排行查询和库存提示、LiveChat报表
开发语言·c#·wpf
唐青枫21 小时前
别滥用 Task.Run:C# 异步并发实操指南
c#·.net
我好喜欢你~1 天前
C#---StopWatch类
开发语言·c#
一阵没来由的风1 天前
拒绝造轮子(C#篇)ZLG CAN卡驱动封装应用
c#·can·封装·zlg·基础封装·轮子
一枚小小程序员哈2 天前
基于微信小程序的家教服务平台的设计与实现/基于asp.net/c#的家教服务平台/基于asp.net/c#的家教管理系统
后端·c#·asp.net
Eternity_GQM2 天前
【Word VBA Zotero 引用宏错误分析与改正指南】【解决[21–23]参考文献格式插入超链接问题】
开发语言·c#·word