继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

C#总结(二)事件Event 介绍总结

章为忠
关注TA
已关注
手记 6
粉丝 40
获赞 254

最近在总结一些基础的东西,主要是学起来很难懂,但是在日常又有可能会经常用到的东西。前面介绍了 C# 的 AutoResetEvent的使用介绍, 这次介绍事件(event)。

事件(event),对于初学者来说,确实比较神秘,难懂。但是在日常编程过程中却经常遇到。事件使用得当,会让你的代码更加整洁,也能少些很多代码。

一、Event事件,是一种封装过的委托。

它拥有以下三要素:
  1. 事件发行者:达到某些条件时激发事件的对象
  2. 事件订阅者:订阅事件并对事件发生时进行处理的对象
  3. 定义发行者和订阅者关系,一个发行者可能会有多个订阅者。
  事件发行者和事件订阅者通过委托(delegate) 来实现发送方和接收方的事件触发。

它拥有哪些好处:

在以往我们编写订阅这类程序中,往往采用等待机制,为了等待某件事情的发生,需要不断地检测事情什么时候发生,而通过事件(event),可以大大简化了这种过程:
  1. 使用事件,可以很方便地确定程序执行顺序。
  2. 当事件驱动程序等待事件时,它不占用很多资源。事件驱动程序与过程式程序最大的不同就在于,程序不再不停地检查输入设备,而是呆着不动,等待消息的到来,每个输入的消息会被排进队列,等待程序处理它。如果没有消息在等待,则程序会把控制交回给操作系统,以运行其他程序。
  3. 事件简化了编程。事件订阅者只是简单地将消息传送给事件发行者,由发行者的事件驱动程序确定事件的处理方法。不必知道程序的内部订阅触发机制,只是需要知道如何传递消息即可。

二、事件和委托的区别

1.委托允许直接通过委托去访问相应的处理函数,而事件只能通过公布的回调函数去调用,

2.事件只能通过“+=”,“-=”方式注册和取消订户处理函数,而委托除此之外还可以使用“=”直接赋值处理函数。

三、事件的声明(Event)

在类的内部声明事件,首先必须声明该事件的委托类型。例如:

public delegate void NumManipulationHandler(NumEventArgs e);

然后,声明事件本身,使用 event 关键字:

    // 基于上面的委托定义事件
    public event NumManipulationHandler ChangeNum;

上面的代码定义了一个名为 NumManipulationHandler 的委托和一个名为 ChangeNum 的事件,该事件是在某个值生成的时候会调用委托事件。

四、实例
public class Program
{
    public static void Main()
    {

        NumEvent even = new NumEvent(0);
        even.ChangeNum += EventAction.Action;

        even.SetValue(7);
        even.SetValue(11);

        System.Console.ReadKey();
    }
}

public class NumEvent
{
    private int value;

    public delegate void NumManipulationHandler(NumEventArgs e);

    public event NumManipulationHandler ChangeNum;

    public virtual void OnChangeNum(NumEventArgs e)
    {
        ChangeNum?.Invoke(e);
    }

    public NumEvent(int n)
    {
        SetValue(n);
    }

    public void SetValue(int n)
    {
        if (value != n)
        {
            NumEventArgs e = new NumEventArgs(n);
            value = n;
            OnChangeNum(e);
        }
    }
}

public class EventAction
{
    public static void Action(NumEventArgs e)
    {
        System.Console.WriteLine("value : " + e.value);
    }
}

public class NumEventArgs : EventArgs
{
    public int value;
    public NumEventArgs(int _value)
    {
        this.value = _value;
    }
}
打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP