zoukankan      html  css  js  c++  java
  • C#之事件初步

        上文简述了委托,所谓的简述,只是说了一下如何使用委托,既然有了委托的基础,便可以稍微一探事件的机制。

        事件,实际上是委托类型,事件处理函数如下:

     public delegate void  MyHander(object sender, MyEventArgs e);//声明一个委托,其中要与事件的签名一致

        委托要与将要处理的函数形式一致,所以其有两个参数,一个是消息的发送者sender,即触发事的对象,一个是包含的要处理的数据e。

        对与上述代码,其中,MyEventArgs属于定义的一个类,继承于EventArgs,这个类基本包含了GUI所需的一切数据,但是额外的需求,就需要另外定义,例如本文后附带的例子。

    事件,

    public event MyHander myevent;

    定义了一个事件类型的变量,其中MyHander是一个声明好的委托类型。

    首先委托与函数关联,然后事件与委托关联,如此,事件便可以调用函数,基本流程如下(实际代码组织时,这几句不会挨着的):

     public delegate void  MyHander(object sender, MyEventArgs e);
     MyHander myhander = new MyHander(OutPut);//OutPut是一个执行具体功能的函数,通过此,委托与函数关联
    public event MyHander myevent;//定义事件变量
    myevent += myhander;//事件与委托关联
    
    //下面触发事件
    myevent(this,e);

    完整的一个代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace EvenTest2
    {
       public class MyEventArgs : EventArgs//1.写好自己定义的继承基本的事件参数类  这个要是共有类
        {
            public string sentence;
        }
        public delegate void  MyHander(object sender, MyEventArgs e);//2、声明一个委托,其中要与事件的签名一致
        class A
        {
            public void OutPut(object sender, MyEventArgs e)//3、设计好实际做事的类
            {
                Console.WriteLine(e.sentence);
            }
            public A(B b)//5、(跳一步,这是第五步)根据1步中声明的委托,定义一个委托变量,然后将这个委托变量与OutPut这个干活的绑定一起
            {
                MyHander myhander = new MyHander(OutPut);
                b.myevent += myhander;//6、将B中声明的事件与 上一句中处理好的委托变量绑定,这样,便可以通过myevent调用OutPut了
            }
        }
        class B//4、设计事件的类,也就是设计用来调用委托对象的事件,通过A类的构造函数与其绑定,方可以调用
        {
            public event MyHander myevent;
            public void callevent(MyEventArgs e)
            {
                if (myevent != null)
                {
                    myevent(this, e);//7、这一句是调用的开端,从此,如链式爆炸一般,一发不可收拾myevent-myhander-OutPut
                }
            }
        }
         class Program
        {
            static void Main(string[] args)
            {
                MyEventArgs e1 = new MyEventArgs();
                e1.sentence = "我也会自定义事件了!!!";
                B b = new B();
                A a = new A(b);
                b.callevent(e1);
    
            }
        }
    }
    View Code

     其实,我觉得这段来自网络自己改的代码存在一点问题,绕了一点。就是 是 event 接收了 delegate类型的参数,而delegate接受了function,实际上,可以直接event 用+= 或者 -=接受function(来自C#本质论中文版第三版398页)。

  • 相关阅读:
    leetcode 1301. 最大得分的路径数目
    LeetCode 1306 跳跃游戏 III Jump Game III
    LeetCode 1302. 层数最深叶子节点的和 Deepest Leaves Sum
    LeetCode 1300. 转变数组后最接近目标值的数组和 Sum of Mutated Array Closest to Target
    LeetCode 1299. 将每个元素替换为右侧最大元素 Replace Elements with Greatest Element on Right Side
    acwing 239. 奇偶游戏 并查集
    acwing 238. 银河英雄传说 并查集
    acwing 237程序自动分析 并查集
    算法问题实战策略 MATCHORDER 贪心
    Linux 安装Redis全过程日志
  • 原文地址:https://www.cnblogs.com/tntboom/p/3967482.html
Copyright © 2011-2022 走看看