C#事件详解

本文详细介绍了C#中的事件概念,包括事件的五大组成部分(拥有者、响应者、事件处理器、订阅和事件发生流程),以及如何通过委托和事件处理器实现事件的触发和响应。
摘要由CSDN通过智能技术生成

22、C#事件的定义与基本使用

1.事件的理解:

类包含三大类型(属性:存储数据,方法:做事情,事件:通知别的对象)

其实事件的一个设计思想就是一个发布订阅者模式,事件本质是对委托字段的一个包装器,类似于C#中字段和属性的关系,

要理解事件,我们先来了解事件的五个重要部分:

  • 事件的拥有者:也就是声明了事件的对象或者类
  • 事件本身(event,也叫事件源):是事件拥有者里的内容,是一种类型,是委托字段的包装器,对委托字段起限制作用,(一种特殊的委托类型,只能做+=和-=操作),事件和委托的关系就类似于C#中字段和属性的关系
  • 事件的响应者(也叫订阅者):就是当事件触发时要做出响应的对象或者类
  • 事件处理器:是事件响应者所包含的内容,当事件被触发时,事件的响应者会做出的操作,其实就是个回调方法
  • 订阅:把事件处理器和事件关联在一起,本质上是一种以委托类型为基础的约定

2.事件发生的流程:

一个类或者对象里声明了事件,当事件发生的时候,所有的事件订阅者都会收到事件发生,还会收到事件参数,然后调用事件处理器;

internal class Program
{
    static void Main(string[] args)
    {
        EventOwned owned = new EventOwned();    //事件拥有者
        EventResponse response = new EventResponse();   //事件响应者
        owned.MyEnvent += response.Action;      //订阅事件
        owned.EventTrigger();       //事件发生时,订阅事件的函数也会发生
        Console.ReadLine();


    }
}

/// <summary>
/// 我的事件参数类
/// </summary>
public class MyEventArgs : EventArgs
{
    public string arg = null;
}

public delegate void MyEventHandler(object sender, MyEventArgs e);

/// <summary>
/// 事件拥有者类
/// </summary>
public class EventOwned
{
    //声明事件有两种方式:
    /*  一、完整的声明:
        1.先声明委托
        2.再声明事件
     */
    private MyEventHandler myEventHandler;  
    /// <summary>
    /// 事件本身
    /// </summary>
    public event MyEventHandler MyEnvent
    {
        add
        {
            this.myEventHandler += value;
        }
        remove
        {
            this.myEventHandler -= value;
        }
    }
    //二、简单声明:其实是一个C#的一个语法糖,自动生成了委托字段,事件是委托字段的包装器
    //public event MyEventHandler MyEnvent;

    /// <summary>
    /// 事件触发方法
    /// </summary>
    public void EventTrigger()
    {
        //如果绑定(订阅)了事件
        if (this.myEventHandler != null)
        {
            //调用事件
            myEventHandler(this, new MyEventArgs { arg = "参数" });
        }
    }
}

/// <summary>
/// 事件响应类
/// </summary>
public class EventResponse
{
    /// <summary>
    /// 事件处理器
    /// </summary>
    /// <param name="sender">事件拥有者对象</param>
    /// <param name="e"></param>
    internal void Action(object sender, EventArgs e)
    {
        MyEventArgs args = e as MyEventArgs;
        Console.WriteLine(sender.GetType());

        Console.WriteLine("事件处理器运行"); 
    }
}

值得注意的是:在别的类中不能直接调用事件,只能通过定义事件类的方法来间接的调用事件。

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值