zoukankan      html  css  js  c++  java
  • 委托、事件、自定义事件(转载)

    转载自:http://www.pianshu.net/blog/article.asp?id=207
    一、委托
    委托类似于函数指针,但函数指针只能引用静态方法,而委托既能引用静态方法,也能引用实例方法。

    委托使用分三步:1、委托声明。2、委托实例化。3、委托调用。
    例程一:
    程序代码 程序代码

    using System;

    namespace 委托
    {
        delegate int NumOpe(int a,int b); //委托声明
        class Class1
        {
            static void Main(string[] args)
            {
                Class1 c1 = new Class1();
                NumOpe p1 = new NumOpe(c1.Add); //委托实例化
                Console.WriteLine(p1(1,2)); //委托调用
                Console.ReadLine();
            }

            private int Add(int num1,int num2)
            {
                return(num1+num2);
            }
        }
    }

    例中,委托NumOpe引用了方法Add。
    委托声明了以后,就可以象类一样进行实例化,实例化时把要引用的方法(如:Add)做为参数,这样委托和方法就关联了起来,就可以用委托来引用方法了。
    委托和所引用的方法必须保持一致:
    1、参数个数、类型、顺序必须完全一致。
    2、返回值必须一致。

    二、事件

    事件有很多,比如说鼠标的事件:MouserMove,MouserDown等,键盘的事件:KeyUp,KeyDown,KeyPress。

    有事件,就会有对事件进行处理的方法,而事件和处理方法之间是怎么联系起来的呢?委托就是他们中间的桥梁,事件发生时,委托会知道,然后将事件传递给处理方法,处理方法进行相应处理。

    比 如在WinForm中最常见的是按钮的Click事件,它是这样委托的:this.button1.Click +=  new System.EventHandler(this.button1_Click);按按钮后就会出发button1_Click方法进行处 理。EventHandler就是系统类库里已经声明的一个委托。

    三、自定义事件及其处理

    EventHandler以及其它自定义的事件委托都是一类特殊的委托,他们有相同的形式:

    delegate void 事件委托名(object sender,EventArgs e);

    object用来传递事件的发生者,比如二中的Button控件就是一个事件发生者;EventArgs用来传递事件的细节。

    例程二:
    程序代码 程序代码

    using System;

    namespace 最简单的自定义事件
    {
        /// <summary>
        /// 事件发送类
        /// </summary>
        class Class1
        {
            public delegate void UserRequest(object sender,EventArgs e); //定义委托
            public event UserRequest OnUserRequest; //定义一个委托类型的事件

            public void run()
            {
                while(true)
                {
                    if(Console.ReadLine()=="a")
                    {//事件监听
                        OnUserRequest(this,new EventArgs()); //产生事件
                    }
                }
            }
        }

        /// <summary>
        /// 事件接收类
        /// </summary>
        class Class2
        {
            static void Main(string[] args)
            {
                Class1 c1 = new Class1();
                c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest); //委托实例化后绑定到事件
                c1.run();
            }

            private static void c1_OnUserRequest(object sender, EventArgs e)
            {//事件处理方法
                Console.WriteLine("\t你触发了事件!");
            }
        }
    }

    例程三:
    程序代码 程序代码

    using System;

    namespace 带事件数据的事件
    {
        /// <summary>
        /// 带事件数据的事件类,从EventArgs继承
        /// </summary>
        class OnUserRequestEventArgs:EventArgs
        {
            private string inputText;
            public string InputText
            {
                get
                {
                    return inputText;
                }
                set
                {
                    inputText = value;
                }
            }
        }

        /// <summary>
        /// 事件发送类
        /// </summary>
        class Class1
        {
            public delegate void UserRequest(object sender,OnUserRequestEventArgs e);
            public event UserRequest OnUserRequest;

            public void run()
            {
                while(true)
                {
                    Console.WriteLine("请输入内容:");
                    string a=Console.ReadLine();
                    //if(a=="a")
                    //{
                    OnUserRequestEventArgs e1 = new OnUserRequestEventArgs();
                    e1.InputText = a;
                    OnUserRequest(this,e1);
                    //}
                }
            }
        }

        /// <summary>
        /// 事件接收类
        /// </summary>
        class Class2
        {
            [STAThread]
            static void Main(string[] args)
            {
                Class1 c1 = new Class1();
                c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest);
                c1.run();
            }

            private static void c1_OnUserRequest(object sender, OnUserRequestEventArgs e)
            {
                Console.WriteLine("\t你输入的是:"+e.InputText);
            }
        }
    }

    例程三跟例程二唯一的差别在于自定义了一个类OnUserRequestEventArgs,从EventArgs继承。
  • 相关阅读:
    读书笔记之理想设计的特征
    一些javascript 变量声明的 疑惑
    LINQ 使用方法
    Google MySQL tool releases
    读书笔记之设计的层次
    EF之数据库连接问题The specified named connection is either not found in the configuration, not intended to be used with the Ent
    转载 什么是闭包
    javascript面向对象起步
    Tips
    数据结构在游戏中的应用
  • 原文地址:https://www.cnblogs.com/zjbtony/p/738434.html
Copyright © 2011-2022 走看看