C# 事件详解附实例分析

一、定义

事件是两个对象间发布消息和响应后处理消息的过程,通过委托类型来实现的。
事件的机制被称为发布-订阅机制,其算法过程为:首先定义一个委托类型,然后在发布者类中声明一个event事件,同时此类中还有一个用来触发事件的的方法,通过此方法来关联事件。声明订阅者类,其中定义一个被调用方法,最后在主函数中完成事件的关联和对方法的调用。

二、示例

1. 无参委托类型

举个简单的例子,我委托女朋友给我买东西,那我需要定义一个发布者类Me和一个订阅者类Girlfriend。🐶

public class Me//发布者是我,hehe
    {
        public delegate void Buyfoodforme();//定义委托类型
        private int a;
        public event Buyfoodforme Buy;//基于委托类型定义事件
        public void Linkevent()
        {
            if (Buy != null)
            {
                Buy();
            }
            else
            {
                Console.WriteLine("回来吧,我不想买了");
                
                Console.ReadKey();//按回车继续
            }
        }

        public Me() //定义构造函数,单纯试验下
        {
            int a = 6;
            GetState(a);
        }

        public void GetState(int b)
        {
            if (a != b)
            {
                a = b;
                Linkevent();
            }
        }
    }

    public class Girlfriend//订阅者。。
    {
        public void Runtobuy()
        {
            Console.WriteLine("我要赶紧跑步去买,嘻嘻");
            Console.ReadKey();
        }
    }

在主函数中关联事件

public class Program
    {
        public static void Main()
        {
            Me me = new Me();//创建对象,同时调用构造函数Me,输出"回来吧,我不想买了"
            Girlfriend gf = new Girlfriend();
            me.Buy += new Me.Buyfoodforme(gf.Runtobuy);//关联被调用事件
            me.GetState(1);
        }
    }

2. 有参委托类型

using System;

namespace Event1
{
    public delegate int NumManipulationHandler(int a, int b);
    //发布者类
    public class EventTest
    {
        //声明事件
        public event NumManipulationHandler Numevent;
        int a = 1;
        int b = 1;
        //触发事件的函数
        public void OnNumChanged()
        {
            Numevent?.Invoke(a, b);//空检查运算符      
        }
    }

    //订阅者类
    public class Suber
    {
        public int Sum(int a, int b)
        {
            
            Console.WriteLine("Subscriber the changed number is {0}", a + b);
            return a + b;
        }

        public int Sub(int a, int b)
        {

            Console.WriteLine("Subscriber the changed number is {0}", a - b);
            return a - b;
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            EventTest e = new EventTest();
            Suber s = new Suber();
            e.Numevent += s.Sum;//注册方法
            e.Numevent += s.Sub;
            e.OnNumChanged();//触发事件
        }
    }
}

定义一个事件有两步,首先定义一个委托,它包括了这件事的“协议”和委托方法(由谁去做);其次,用event关键字和相关委托声明这个事件。事件像是一个接口,封装了委托所定的“协议”。由于委托已经定义了协议,剩下的就是按这个协议去办事,至于怎么做它并不关心。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
委托是 C# 中的一种类型,它允许您将方法作为参数传递给其他方法或将方法存储在变量中,并在需要时调用它们。委托通常用于事件处理程序和回调函数。 事件是委托的一种特殊实现,它允许您在对象上注册和注销事件处理程序。当事件发生时,所注册的事件处理程序将被调用。 以下是一个示例,演示如何使用委托和事件: ```csharp using System; public class Program { // 定义一个委托类型 public delegate void MyDelegate(string message); public class MyClass { // 声明一个事件,使用 MyDelegate 委托类型 public event MyDelegate MyEvent; public void RaiseEvent(string message) { // 在事件上调用所有已注册的委托 MyEvent?.Invoke(message); } } public static void Main() { MyClass myClass = new MyClass(); // 注册一个委托作为事件处理程序 myClass.MyEvent += new MyDelegate(MyEventHandler); // 调用 RaiseEvent 方法,触发事件 myClass.RaiseEvent("Hello World"); } public static void MyEventHandler(string message) { Console.WriteLine(message); } } ``` 在上面的示例中,我们定义了一个委托类型 MyDelegate,并在 MyClass 类中声明了一个事件 MyEvent,使用 MyDelegate 委托类型。在 MyClass 类中,我们使用 RaiseEvent 方法来触发事件,并在该方法中调用已注册的委托。在 Main 方法中,我们创建了 MyClass 实例,并注册了一个委托作为事件处理程序。最后,我们调用 RaiseEvent 方法,触发事件,并在事件处理程序中打印消息。 希望这个示例可以帮助您更好地理解委托和事件C# 中的使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值