C# 一个完整的委托、事件学习示例

这篇具有很好参考价值的文章主要介绍了C# 一个完整的委托、事件学习示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

该示例符合委托、事件的定义规则,并且可以帮助大家更好地理解委托和事件的使用!

先定义了一个名为MyEventArgs的类,继承自EventArgs,它包含一个Message属性,用于存储传递的消息。Publisher类中添加了一个protected virtual的方法OnMyEvent,用于触发MyEvent事件,并传递MyEventArgs对象作为参数。在PublishMessage方法中,实例化了一个MyEventArgs对象,并通过调用OnMyEvent方法来触发事件。

Subscriber类中,修改了HandleEvent方法的签名,使其与MyDelegate委托类型匹配。当事件被触发时,通过MyEventArgs对象的Message属性获取传递的消息。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    internal class Program
    {

        // 定义事件数据类
        class MyEventArgs : EventArgs
        {
            public string Message { get; set; }
        }

        // 定义委托类型
        delegate void MyDelegate(object sender, MyEventArgs e);

        // 发布者类
        class Publisher
        {
            // 声明事件
            public event MyDelegate MyEvent;
             // 用于触发事件的保护方法
            protected virtual void OnMyEvent(MyEventArgs e)
            {
               
                MyEvent?.Invoke(this, e);
            }
               // 触发事件的方法
            public void PublishMessage(string message)
            {
                MyEventArgs args = new MyEventArgs { Message = message };
                OnMyEvent(args);
            }
        }

        // 订阅者类
        class Subscriber
        {
            public Subscriber(Publisher publisher)
            {
                // 订阅事件
                publisher.MyEvent += HandleEvent;
            }
                 // 事件处理方法
            private void HandleEvent(object sender, MyEventArgs e)
            {
                Console.WriteLine("Received message: " + e.Message);
            }
        }

        static void Main(string[] args)
        {
            // 创建发布者对象
            Publisher publisher = new Publisher();

            // 创建订阅者对象
            Subscriber subscriber = new Subscriber(publisher);

            // 发布消息
            publisher.PublishMessage("Hello World!");

            Console.ReadLine();
        }
    }

}

在这个程序中,有一个发布者类 Publisher 和一个订阅者类 Subscriber。发布者类定义了一个事件 MyEvent,并且有一个触发事件的方法 OnMyEvent。订阅者类在构造函数中订阅了发布者类的事件,并且定义了事件处理方法 HandleEvent

在 Main 方法中,创建了一个发布者对象 publisher 和一个订阅者对象 subscriber。然后通过调用 publisher 的 PublishMessage 方法发布一条消息。当消息发布时,订阅者会接收到消息并输出到控制台。

这个程序展示了事件和委托的典型用法,通过事件和委托可以实现对象之间的松耦合通信,使代码更加模块化和可扩展。

自定义事件参数类MyEventArgs

在 C# 中,事件通常由两个元素组成:事件本身和事件参数。事件参数类可能会包含一些属性,用于描述事件所携带的数据,以便在事件被触发时将这些数据传递给事件处理程序。MyEventArgs 是一个自定义的事件参数类,事件参数类会继承自 System.EventArgs 类,因 System.EventArgs 是 .NET Framework 中通用的事件参数基类。

在这个例子中,MyEventArgs 类包含一个名为 EventMessage 的属性,用于携带事件的消息信息。在触发 MyEvent 事件时,可以实例化一个 MyEventArgs 对象,并将它传递给事件处理程序,以便处理程序可以获取事件相关的信息。

 将OnMyEvent 与PublishMessage两个方法分开编写的好处在于代码的清晰性和可维护性。

OnMyEvent 方法,符合C#事件触发方法的命名规则(以 On 开头,后面跟上事件的名称),是用来触发事件的保护虚拟方法,通常用于在派生类中重写,以便在事件触发前进行一些额外的逻辑处理。这种设计模式符合了开闭原则,即对修改是封闭的,对扩展是开放的。将事件触发的逻辑封装在单独的方法中,使得在未来需要修改事件触发逻辑时可以在派生类中重写 OnMyEvent 方法,而无需修改 PublishMessage 方法。

PublishMessage 方法则是用于发布消息的公共方法,它创建事件参数并调用 OnMyEvent 方法来触发事件。这种分离的设计使得代码更易于理解和维护。

将这两句代码合并成一个方法可能会导致发布消息的逻辑与事件的触发逻辑紧密耦合在一起,增加了代码的复杂性和可维护性。因此,将它们分开写可以使代码更加清晰和易于理解。

 订阅事件放在构造函数里好呢,还是在执行代码中随时添加?

订阅事件应该根据具体的业务逻辑需求来决定是放在构造函数里还是在执行代码中随时添加。

如果订阅事件是作为对象的基本行为并且在整个对象的生命周期中都需要订阅,那么将订阅事件的代码放在构造函数中是一个合适的选择。这样可以确保在对象创建时就会订阅事件,而无需在每次使用对象时都手动添加订阅。

另一方面,如果订阅事件是根据特定的条件或者动态的情况来确定的,那么在执行代码中随时添加订阅可能会更合适。这样可以根据需要在适当的时候订阅事件,从而更灵活地管理事件订阅。

总的来说,根据具体的业务逻辑需求来决定订阅事件是放在构造函数还是在执行代码中随时添加,以确保代码结构清晰、易于理解和维护。文章来源地址https://www.toymoban.com/news/detail-733857.html

到了这里,关于C# 一个完整的委托、事件学习示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 1024 程序员节,圆一个小小的梦

    Hope is a good thing, maybe the best of things, and no good thing ever dies. 希望是件美丽的东西,也许是最好的东西,而美好的东西是永远不会消逝的。 大家好,我是勇哥 。 1024 , 程序员节,圆了我一个小小的梦。 花了半年时间,我写了一本电子书 ,书名是:《 RocketMQ4.X设计精要 》,我想

    2024年02月08日
    浏览(50)
  • c# 事件与委托

    //在C#中, 事件是一种特殊的委托 ,它允许对象通知其他对象发生了某个特定的事件。 //事件通常用于GUI应用程序中,例如当用户单击按钮时,按钮控件会引发Click事件, //然后其他对象可以订阅该事件并执行相应的操作。 //以下是一个简单的示例,演示如何在C#中使用事件和

    2024年02月06日
    浏览(28)
  • 委托与事件(一)——C#版本

      委托是对 函数的封装 ,可以当作给方法的特征指定一个名称。而事件则是 委托的一种特殊形式 ,当发生有意义的事情时,事件对象处理通知过程。   委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有 完全相同的行为 。   用例子来说明为

    2023年04月09日
    浏览(34)
  • C#委托和事件简单复习

    太久没用了,简单的复习一下 快速过一遍语法使用 1.定义一个委托类型 只需要在声明的前面加上delegate,其他的就跟声明一个方法(函数)类似 2.使用刚刚声明的委托 需要定义一个返回值跟参数与我们刚刚定义的委托一致 3.然后声明一个SayHello类型(委托)的变量 把

    2024年02月14日
    浏览(32)
  • C# 中的委托和事件机制

    在C#中,委托和事件是非常重要的概念,用于实现程序中的回调和事件处理。在这里,我们将介绍C#中委托和事件机制的基础知识和用法。 委托是一种类似于C/C++函数指针的概念,它允许将方法作为参数传递到其他方法中,以实现回调函数的功能。委托是一种类型,它可以表示

    2023年04月21日
    浏览(28)
  • C# 事件和委托的区别并说明

    事件是基于委托的,为委托提供了一个发布/订阅机制。可以说事件是一种特殊的委托,他的调用和委托是一样的。 事件的声明 public event 委托类型 事件名称 通常事件的命名以事件名称+Event来命名。如public event delegate NotifyEvent; 事件和委托的区别如下: 事件只能在方法的外部

    2024年02月07日
    浏览(29)
  • 【C# Programming】委托和lambda表达式、事件

    目录 一、委托和lambda表达式 1.1 委托概述 1.2 委托类型的声明 1.3 委托的实例化 1.4 委托的内部机制  1.5 Lambda 表达式 1.6 语句lambda 1.7 表达式lambda 1.8 Lambda表达式 1.9 通用的委托 1.10 委托没有结构相等性 1.11 Lambda表达式和匿名方法的内部机制 1.12 外部变量 1.13 外部变量的

    2024年02月06日
    浏览(37)
  • 【C#进阶】C#中的委托、事件、回调函数、匿名函数和lambda表达式

    委托是一种类型,它可以存储对一个或多个方法的引用。它类似于C/C++中的函数指针,允许您将方法作为参数传递、存储和调用。 写法: delegate return_type delegate_name( ); return_type :表示委托所引用方法的返回类型。 delegate_name :表示委托的名称。 parameters :表示委托所引用方法

    2024年02月06日
    浏览(47)
  • C#中的委托(Delegate)和事件 (Event)详解与使用范例

    最近天气晴雨不定,你因为害怕打游戏时忘记在下雨时收衣服或者在天晴时把衣服挂出去,于是你委托好友小明在天气发生变化时打电话通知你,这就是一种委托. 下面是这种委托的实例代码 以上代码的输出为 值得一提的是,如下代码为创建一个继承自Delegate类的名为XiaoMing的子类

    2023年04月12日
    浏览(31)
  • 原生js实现网页淘宝产品展示效果,鼠标移入小图展示对应大图(事件委托、事件传播、冒泡机制)【含完整代码】

    淘宝网页产品展示模块如下: 当鼠标移入小图,在上方会相应地展示大图 当鼠标移入小图,在上方会相应地展示大图;且当鼠标移出,图片停留在移入时显示的图片,不会改变。 本文实现效果如下(鼠标移入即改变,不用点击): 定义图片列表,为列表添加鼠标移入事件

    2024年02月07日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包