【C#】事件处理

定义

事件是指程序中发生的特定动作或状态改变,而事件处理是对这些事件进行响应和处理的机制。通过委托和事件的结合,可以实现一种松耦合的设计模式,即事件驱动编程。在事件驱动编程中,对象之间通过定义事件和相应的委托来进行通信,当事件发生时,注册了对应委托的方法会被调用,从而响应事件。

代码

public class Button
{
    public event EventHandler Click;

    public void OnClick()
    {
        // 触发 Click 事件
        Click?.Invoke(this, EventArgs.Empty);
    }
}

public class Program
{
    static void Main()
    {
        Button button = new Button();
        button.Click += Button_Click;

        button.OnClick();
    }

    static void Button_Click(object sender, EventArgs e)
    {
        Console.WriteLine("按钮被点击了!");
    }
}
按钮被点击了!

在上述示例中,Button 类定义了一个名为 Click 的事件,并使用 EventHandler 委托作为事件处理器的类型。Button 类中的 OnClick 方法用于触发 Click 事件,并通过 Click?.Invoke(this, EventArgs.Empty) 调用注册的事件处理器。在 Program 类中,我们实例化了一个 Button 对象,并通过 += 运算符将 Button_Click 方法注册为 Click 事件的处理器。然后,通过调用 button.OnClick() 触发了按钮的点击事件,并执行了相应的事件处理器方法。 通过使用委托和事件,我们可以轻松地实现事件与事件处理之间的解耦,使得对象的交互更加灵活和可扩展。事件驱动编程模式在图形用户界面(GUI)、用户交互、异步编程等场景中被广泛应用。

using System;

namespace EventDemo
{
    // 定义一个委托类型,用于事件处理程序
    public delegate void NotifyEventHandler(object sender, EventArgs e);

    // 发布者类
    public class ProcessBusinessLogic
    {
        // 声明事件
        public event NotifyEventHandler ProcessCompleted;

        // 触发事件的方法
        protected virtual void OnProcessCompleted(EventArgs e)
        {
            ProcessCompleted?.Invoke(this, e);
        }

        // 模拟业务逻辑过程并触发事件
        public void StartProcess()
        {
            Console.WriteLine("启动!");

            // 这里可以加入实际的业务逻辑

            // 业务逻辑完成,触发事件
            OnProcessCompleted(EventArgs.Empty);
        }
    }

    // 订阅者类
    public class EventSubscriber
    {
        public void Subscribe(ProcessBusinessLogic process)
        {
            process.ProcessCompleted += Process_ProcessCompleted;
        }

        private void Process_ProcessCompleted(object sender, EventArgs e)
        {
            Console.WriteLine("接收到信息!"+sender.GetType());
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ProcessBusinessLogic process = new ProcessBusinessLogic();
            EventSubscriber subscriber = new EventSubscriber();

            // 订阅事件
            subscriber.Subscribe(process);

            // 启动过程
            process.StartProcess();

            Console.ReadLine();
        }
    }
}
启动!
接收到信息!EventDemo.ProcessBusinessLogic

解析

在C#中,订阅和触发事件的过程如下:

定义事件:

public event EventHandler MyEvent;

定义一个名为 MyEvent 的事件,使用 EventHandler 委托类型作为事件的类型。

定义事件处理器:

private void OnMyEvent(object sender, EventArgs e)
{
    // 处理事件的逻辑代码
}

定义一个名为 OnMyEvent 的方法作为事件处理器,该方法接受两个参数:sender 表示事件的发布者对象,e 表示事件参数。

订阅事件:

MyEvent += OnMyEvent;

使用 += 运算符将事件处理器方法 OnMyEvent 订阅到事件 MyEvent 上。这样,当 MyEvent 事件触发时,事件处理器方法将被调用。

触发事件:

MyEvent?.Invoke(this, EventArgs.Empty);

使用 ?.Invoke 语法触发事件 MyEvent。这会依次调用所有订阅了该事件的事件处理器方法。参数 this 表示事件的发布者对象,EventArgs.Empty 表示事件参数,此处使用了空的参数对象。

解除事件订阅:

MyEvent -= OnMyEvent;

使用 -= 运算符将事件处理器方法 OnMyEvent 从事件 MyEvent 的订阅列表中解除订阅。这样,当 MyEvent 事件触发时,事件处理器方法将不再被调用。

以上是订阅和触发事件的基本步骤,你可以根据实际需求和场景进行调整和扩展。请注意,事件的订阅和触发操作应该在适当的时机进行,以确保正确的事件处理流程。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容