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页)。

  • 相关阅读:
    【转】Visual Studio 2008中使用科学计算库GSL
    【转】[Python Tip]如何在Windows下方便地进入命令行运行程序
    【转】URL Encoding (URL转义字符)
    RDLC报表,纯文字内容,动态数据源 解决方案
    C# 数值计算
    标准库List使用注意
    VS2008 运行出现 “无法启动该程序 计算机中丢失 MSVCR90D.dll”
    数据结构在游戏中的简单应用(转)
    SQL SERVER 2005 四种排序函数
    2010.11.30
  • 原文地址:https://www.cnblogs.com/tntboom/p/3967482.html
Copyright © 2011-2022 走看看