LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#事件机制深度解析:委托、事件声明与订阅实战

admin
2024年11月19日 9:27 本文热度 143

C#中的事件机制是一种基于委托(delegate)的发布/订阅模式,它允许对象在发生特定动作或状态改变时通知其他对象。以下是C#中事件机制的实现方式的详细描述:

一、事件的基本概念

事件可以理解为某个对象所发出的消息,以通知特定动作(行为)的发生或状态的改变。这些行为可能来自用户交互(如鼠标点击)或其他程序逻辑。触发事件的对象被称为事件发送者(sender),而捕获和响应事件的对象则被称为事件接收者。

二、委托的定义

在C#中,委托是一种特殊的类型,它定义了方法的类型签名,并允许将方法作为参数进行传递。委托类似于C++中的函数指针,但它是类型安全的。委托的声明格式如下:

public delegate void MyDelegate(string message);

这里,MyDelegate是一个委托类型,它表示一个接受string类型参数并返回void的方法。

三、事件的声明与触发

1.声明事件:在类中,使用event关键字声明事件,并将其与委托类型关联。例如:

public event MyDelegate MyEvent;

这里,MyEvent是一个事件,它使用MyDelegate委托类型。

2.触发事件:在类的内部,可以定义一个方法来触发事件。这个方法通常被称为事件的触发器或引发器。例如:

protected virtual void OnMyEvent(string message){    MyEvent?.Invoke(this, message);}

在这个例子中,OnMyEvent方法使用?.运算符来安全地触发MyEvent事件。如果MyEvent不为null,则调用所有订阅了该事件的方法。

四、事件的订阅与取消订阅

1.订阅事件:其他对象可以通过“+=”运算符订阅事件。例如:

MyClass myObject = new MyClass();myObject.MyEvent += MyEventHandler;

这里,MyEventHandler是一个与MyDelegate委托类型匹配的方法,它将被添加到myObject的MyEvent事件的订阅者列表中。

2.取消订阅事件:同样地,对象可以通过“-=”运算符取消订阅事件。例如:

myObject.MyEvent -= MyEventHandler;

这将从myObject的MyEvent事件的订阅者列表中移除MyEventHandler方法。

五、事件的使用示例

以下是一个简单的事件使用示例:

using System;
namespace EventExample{    // 定义委托    public delegate void NumberChangedEventHandler(object sender, NumberChangedEventArgs e);
   // 自定义事件参数类,继承自EventArgs    public class NumberChangedEventArgs : EventArgs    {        public int OldValue { get; }        public int NewValue { get; }
       public NumberChangedEventArgs(int oldValue, int newValue)        {            OldValue = oldValue;            NewValue = newValue;        }    }
   // 发布器类    public class Counter    {        private int _count = 0;
       // 声明事件        public event NumberChangedEventHandler CountChanged;
       // 触发事件的方法        protected virtual void OnCountChanged(int oldValue, int newValue)        {            CountChanged?.Invoke(this, new NumberChangedEventArgs(oldValue, newValue));        }
       // 改变计数值并触发事件的方法        public void Increment()        {            int oldValue = _count;            _count++;            OnCountChanged(oldValue, _count);        }    }
   // 订阅器类    public class CounterObserver    {        public void HandleCountChanged(object sender, NumberChangedEventArgs e)        {            Console.WriteLine($"Count changed from {e.OldValue} to {e.NewValue}");        }    }
   // 主程序    class Program    {        static void Main(string[] args)        {            Counter counter = new Counter();            CounterObserver observer = new CounterObserver();
           // 订阅事件            counter.CountChanged += observer.HandleCountChanged;
           // 改变计数值,触发事件            counter.Increment();            counter.Increment();
           // 取消订阅事件            counter.CountChanged -= observer.HandleCountChanged;
           // 再次改变计数值,不会触发事件            counter.Increment();
           Console.ReadLine();        }    }}

在这个示例中,Counter类是一个发布器,它有一个CountChanged事件。CounterObserver类是一个订阅器,它有一个HandleCountChanged方法来处理CountChanged事件。在Main方法中,我们创建了一个Counter对象和一个CounterObserver对象,并订阅了CountChanged事件。然后,我们调用Increment方法来改变计数值并触发事件。最后,我们取消订阅了事件,并再次调用Increment方法来验证事件是否已被取消订阅。


该文章在 2024/11/19 9:27:57 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved