C#自定义事件的实现方法与步骤详解

闻溪
闻溪
发布时间:2026-10-14| 3人浏览过
原创

C#中的自定义事件是实现对象间解耦通信的重要机制。掌握其核心步骤有助于构建灵活的应用程序架构,本文将逐步拆解从委托定义到事件触发的全过程。

自定义事件的核心原理

C#中的事件基于发布-订阅模式,底层依赖于委托(Delegate)和关键字 event。通过自定义事件,类可以通知其他对象发生了特定动作,而无需知道处理该动作的具体细节。实现一个完整的自定义事件通常遵循标准的五步流程。

具体实现步骤

第1步:定义事件委托

委托是类型安全的函数指针。在声明事件之前,必须先定义一个委托来描述该事件携带的数据签名。标准做法是使用 void 返回类型,并包含两个参数:object sender(发起者)和 EventArgs(事件数据)。

public delegate void AlarnEven(object sender, EventArgs e);

若需传递自定义数据,可继承 System.EventArgs 创建专用参数类,并在委托定义中替换 EventArgs。

第2步:在类中声明事件

使用 event 关键字结合上一步定义的委托类型来声明事件。这限制了外部类只能通过 += 和 -= 操作符订阅或取消订阅事件,防止外部直接赋值或调用。

public event AlarnEven Alarn;

第3步:编写引发事件的逻辑

在类的适当位置添加触发事件的代码。为了安全起见,建议在调用前检查事件是否为 null,以避免在没有订阅者的情况下抛出异常。通常将触发逻辑封装在一个受保护的方法中(如 On...()),以便派生类也可以复用此触发逻辑。

public void OnAlarn() {
    // 检查是否有订阅者
    if(this.Alarn != null){
        Console.WriteLine("狗报警:有小偷进来了.汪汪汪~~~~~~~~~");
        // 触发事件
        this.Alarn(this, new EventArgs());
    }
}

第4步:编写事件处理方法

订阅类需要实现与委托签名匹配的处理方法。该方法接收发送者和事件参数,并执行具体的业务逻辑。

void HostAlarn(object sender, EventArgs e) {
    Console.WriteLine("主人:抓住小偷啦..!");
}

第5步:注册事件处理器

在需要响应事件的类实例化时,使用 += 运算符将事件处理方法绑定到事件中。这种方式实现了观察者模式,使得主业务逻辑与事件处理逻辑分离。

public Host(Dog dog) {
    // 将HostAlarn方法注册到Dog的Alarn事件
    dog.Alarn += new Dog.AlarnEven(HostAlarn);
}

完整示例代码

以下是一个模拟“狗叫报警”场景的完整控制台应用程序示例,展示了上述步骤的实际应用:

namespace 自定义事件
{
    class Program
    {
        static void Main(string[] args)
        {
            // 实例化狗和主人
            Dog dog = new Dog();
            Host host = new Host(dog);

            DateTime now = new DateTime(2013,8,31,22,39,50);
            DateTime nigth = new DateTime(2013,8,31,22,40,0);

            Console.WriteLine("~~~~~~~~~时间开始走啊走啊~~~~~~~~~");
            while(now <nigth){
                Console.WriteLine("当前时间:"+now);
                System.Threading.Thread.Sleep(1000);
                now = now.AddSeconds(1);
            }
            Console.WriteLine("~~~~~~~我是小偷,我来了~~~~~~~~~~~~");
            
            // 触发狗的报警事件
            dog.OnAlarn();
        }
    }

    class Dog {
        // 第一步:声明关于事件的委托
        public delegate void AlarnEven(object sender,EventArgs e);
        
        // 第二步:声明事件
        public event AlarnEven Alarn;
        
        // 第三步:编写引发事件的函数
        public void OnAlarn() {
            if(this.Alarn!=null){
                Console.WriteLine("狗报警:有小偷进来了.汪汪汪~~~~~~~~~");
                this.Alarn(this,new EventArgs());
            }
        }
    }

    class Host { 
        // 第四步:编写事件的处理程序
        void HostAlarn(object sender, EventArgs e) 
        { 
            Console.WriteLine("主人:抓住小偷啦..!"); 
        }
        
        // 第五步:在构造函数中注册事件的处理程序
        public Host(Dog dog) {
            dog.Alarn += new Dog.AlarnEven(HostAlarn);
        }
    }
}

总结

通过以上步骤,我们实现了一个标准的C#自定义事件。这种机制允许对象在不直接依赖对方的情况下进行通信,极大地提高了代码的可维护性和扩展性。以上就是C#自定义事件实现方法的详细内容,更多关于C#事件机制的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。