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!

相关推荐
波力海苔夹心脆6752 小时前
C# 序列化与反序列化详解:System.Text.Json、Newtonsoft.Json、XmlSerializer 用法、特性选项与安全实践
经验分享·后端·c#·json·.net
小羊没烦恼!7 小时前
在Scrum中实施敏捷建模
java·开发语言·windows·算法·c#
Lost of 程序猿8 小时前
建造者模式实战:告别“十参数构造函数“的数据导出任务
后端·设计模式·c#·asp.net
mudtools10 小时前
在.NET现有系统中快速集成飞书任务分配能力
后端·c#·.net
工具派13 小时前
Word文档太大怎么拆分?段落结构与两种拆法的边界实测
开发语言·c#·word
潜龙952713 小时前
需求文档一键变测试用例:手工用例智能生成平台
开发语言·c#
Lost of 程序猿13 小时前
命令模式实战:把“下单后的动作“打包成可执行的任务
后端·设计模式·c#·asp.net·命令模式
淡海水13 小时前
16-01-C#数据结构源码-附录A-术语表
unity·c#·游戏引擎·il2cpp
小羊没烦恼!13 小时前
【译】利用Asp.net MVC处理文件的上传下载
开发语言·缓存·c#·word·powerpoint·.net
波力海苔夹心脆67514 小时前
C# 海康威视摄像头二次开发入门:HCNetSDK 登录、实时预览、云台控制、录像与抓图(WinForms 实战)
开发语言·windows·经验分享·tcp/ip·c#