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!

相关推荐
The Future is mine1 小时前
在.NET Core控制器中获取AJAX传递的Body参数
c#·.netcore
Eiceblue2 小时前
C# 快速检测 PDF 是否加密,并验证正确密码
开发语言·pdf·c#·visual studio
FL16238631292 小时前
C#报错 iText.Kernel.Exceptions.PdfException: ‘Unknown PdfException
开发语言·c#
绿荫阿广13 小时前
互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(五):使用.NET为树莓派开发Wifi配网功能
c#·.net
ou.cs15 小时前
c# :this() 和 :base()区别
开发语言·c#
汪小白JIY18 小时前
【C#】异步和多线程
c#·thread·async·task·threapool
宝桥南山20 小时前
DeepSeek - 尝试一下GitHub Models中的DeepSeek
microsoft·ai·微软·c#·github·.net
lljss20201 天前
C# 一个解决方案放一个dll项目,一个dll测试项目 ,调试dll项目的源码
c#
ghost1431 天前
C#学习第27天:时间和日期的处理
开发语言·学习·c#
jason成都1 天前
c#压缩与解压缩-SharpCompress
开发语言·c#