`

委托事件及其他

    博客分类:
  • .net
阅读更多
委托事件及其他


声明委托   以下语句: Copy Code
public delegate void ProcessBookDelegate(Book book);
声明一个新的委托类型。每个委托类型都描述参数的数目和类型,以及它可以封装的方法的返回值类型。
每当需要一组新的参数类型或新的返回值类型时,都必须声明一个新的委托类型。

实例化委托 
声明了委托类型后,必须创建委托对象并使之与特定方法关联。与所有其他对象类似,新的委托对象用 new 表达式创建。
但是当创建委托时,传递给 new 表达式的参数很特殊:它的编写类似于方法调用,但没有方法的参数。
下列语句:

Copy Code
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
创建与静态方法 Test.PrintTitle 关联的新的委托对象。下列语句:

Copy Code
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
创建与对象 totaller 上的非静态方法 AddBookToTotal 关联的新的委托对象。
在两个例子中,新的委托对象都立即传递给 ProcessPaperbackBooks 方法。

请注意一旦创建了委托,它所关联到的方法便永不改变:委托对象不可改变。

调用委托   创建委托对象后,通常将委托对象传递给将调用该委托的其他代码。
通过委托对象的名称(后面跟着要传递给委托的参数,括在括号内)调用委托对象。
下面是委托调用的示例: Copy Code
processBook(b);
在此示例中,可以通过使用 BeginInvoke 和 EndInvoke 方法同步或异步调用委托。






一、委托
委托类似于函数指针,但函数指针只能引用静态方法,而委托既能引用静态方法,也能引用实例方法。

委托使用分三步: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   =   n委托-网络ew   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继承。
分享到:
评论

相关推荐

    winform中可使用的委托事件,窗体之间可以传值

    C#委托事件,窗体之间可以传值 是两个可以看到效果的实例,也是基本思路,其他想怎么做只要稍微做一下扩展就可以了

    在C++中模拟委托事件方法的例子免资源分

    代码是文章《在C++中模拟委托事件方法》的例子,文章地址为http://blog.csdn.net/gogogo/article/details/6996290,详述了通过静态函数、接口、类模板、类模板事件链等不同方式实现其他语言中的委托事件模式,对于...

    C#面向对象:委托及事件.pdf

    C#面向对象:委托及事件,可将委托看作是一种新类型。当要把方法传递给其它方法时使用 –一个方法需要对另一个方法进行操作,此时需要将第二个方法作为参数传递到第一个方法中 •因为.Net是类型安全的,所以不允许...

    在C++中模拟委托事件方法的例子

    例子中是文章《在C++中模拟委托事件方法》的例子,文章地址为http://blog.csdn.net/gogogo/article/details/6996290,详述了通过静态函数、接口、类模板、类模板事件链等不同方式实现其他语言中的委托事件模式,对于...

    VB.net 事物委托,多控件使用同一事件源码实例

    网上看到很多朋友都问,怎么实现多控件使用相同一个事件的问题,于是自己写点相关的实例。本实例用VB.net2008写的,不过其他版本的语言都基本大同小异。被实例涉及的内容。遍历窗体控件、事件委托等

    C#事件和委托

    里面是10张图片,图片里的内容是关于C#事件和委托的描述,是些理论方面的东西,当然这个网上其他地方也有,之所以传上是为了让别人可以快速的找到这些资料。

    C#跨窗体(Winform)调用控件(委托回调)

    委托回调

    C#委托与事件.pdf

    C#开发过程中,委托和事件是其中最重要的东西,如果不会使用,那么你的C#开发就无法真正的明白。 共享一点资料出来,共大家一起学习提高,顺便赚点积分,好下载其他同学的资料。 共勉,共勉。。。 。。。

    asp.net 事件与委托分析

    delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。

    javascript 中的事件委托详解

    大多数人第一开始的感觉可能就是,每个li上边都添加一个呗,那要是这样的话,估计面试的时候就会GG了,这里就是撤出了我们的事件冒泡和捕获机制,以及事件委托机制,对于上边这些,我们慢慢来看.  首先说一下事件冒泡和...

    轻量级的DOM事件委托小于1KB

    轻量级的DOM事件委托,小于1KB

    c_中如何深入理解“事件与委托”.doc

    事件与委托似乎很难以理解,这是因为它们的使用方式与常用的编码有很大的差别,例如通常编写的都是同步代码,调用一个类型的方法,会即刻出现方法执行的结果,这是符合逻辑的。但在某些情况中,同步代码未必满足需求...

    js中的事件委托或是事件代理使用详解

    它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。那这是什么意思呢?网上的各位大牛们讲事件委托基本上都用了同一个例子...

    C# 多线程异步执行

    使用委托事件模拟多线程下载网络图片,即同时发送多个网络请求下载图片。 也可应用于其他异步多线程执行事件。

    C#中自定义事件和委托实例

    在windows 编程中用到最多的就是控件的事件了,微软给我们很好的方式,把注意力放到事件执行方法的设计和...还可以利用将其他需要顺序执行的方法封装到button的click 事件的委托对象中,这样就能够顺序执行毁掉方法列表

    C#中的delegate委托类型基本学习教程

    委托用于将方法作为参数传递给其他方法。事件处理程序就是通过委托调用的方法。你可以创建一个自定义方法,当发生特定事件时,某个类(如 Windows 控件)就可以调用你的方法。下面的示例演示了一个委托声明: ...

    c#基础知识—委托,匿名函数,lambda

    委托(Delegate)特别用于实现事件和回调方法。所有的委托都派生自 System.Delegate 类。把一个方法当作参数传递,让其它方法进行调用执行。 1.委托的声明 委托声明决定了可由该委托引用的方法。委托可指向一个与其...

    C#零基础学习理解委托

    那么今天我就带着大家一起探讨下委托和事件。 咱们先来看下委托 我主要从以下几个方面讲解 1, 为什么使用委托 2.什么是委托 3.委托如何使用 为什么使用委托? 委托是c#中非常重要的一个概念,使用委托使程序员...

    结合.net框架在C#派生类中触发基类事件及实现接口事件

    在创建可用作其他类的基类的类时,应考虑如下事实:事件是特殊类型的委托,只可以从声明它们的类中调用。派生类无法直接调用基类中声明的事件。尽管有时需要事件仅由基类引发,但在大多数情形下,应该允许派生类调用...

    smoothscroll:使用 requestAnimationFrame 和事件委托的简单纯香草 javascript 平滑滚动

    平滑滚动的简单原生 JavaScript 实现,它实现了事件委托和 requestAnimationFrame(包括 polyfill)。 这是我能找到的最精简、最简单的 vanilla javascript scroll 版本。 它是平滑滚动的修改版本。 重组以包含 ...

Global site tag (gtag.js) - Google Analytics