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!

相关推荐
baivfhpwxf202327 分钟前
prism WPF 对话框
c#·wpf
孪生质数-2 小时前
3-Visual Studio 2022打包NET开发项目为安装包
c#·.net·个人开发·visual studio
不辉放弃3 小时前
Kafka 和 Flink的讲解
java·c#·linq
weixin_307779133 小时前
判断HiveQL语句为ALTER TABLE语句的识别函数
开发语言·数据仓库·hive·c#
勘察加熊人3 小时前
form实现pdf文件转换成jpg文件
pdf·c#
mm_exploration4 小时前
工程项目中通讯协议常见问题
tcp/ip·c#·通讯协议
JQLvopkk4 小时前
C#中编写TCP客户端和服务端
开发语言·tcp/ip·c#
鲤籽鲲15 小时前
C# System.Net.IPAddress 使用详解
网络·c#·.net
运维开发小白19 小时前
使用夜莺 + Elasticsearch进行日志收集和处理
运维·c#·linq
幻想趾于现实20 小时前
C# Winform 入门(4)之动图显示
开发语言·c#·winform