重温委托(delegate)和事件(event)

1.delegate是什么

某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作参数传递。

不过delegate和函数指针还是有点区别的,delegate有许多函数指针不具备的优点。

首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引 用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。

其次,与函数指针相 比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法, 你无须担心delegate会指向无效地址或者越界地址。

例子1:

public class DelegateTest
{
     // 声明delegate对象
     public delegate void CompareDelegate(int a,int b);
     // 欲传递的方法,它与CompareDelegate具有相同的参数和返回值类型
     public static void Compare(int a,int b)
     {
         Console.WriteLine((a>b).ToString());
     }

     public static void Main()
     {
         // 创建delegate对象
         CompareDelegate cd = new CompareDelegate(DelegateTest.Compare);
         // 调用delegate
         cd(1,2);
     }
}

例子2:

public delegate void MyTestDelegate(int i);
public class Program
{
    public static void Main()
    {
        //创建delegate
        ReceiveDelegateArgsFunc(new MyTestDelegate(DelegateFunction));
    }
    //这个方法接收一个delegate类型的参数,也就是接收一个函数作为参数
    public static void ReceiveDelegateArgsFunc(MyTestDelegate func)
    {
        func(21);
    }
    //欲传递的方法
    public static void DelegateFunction(int i)
    {
        System.Console.WriteLine("传过来的参数为: {0}.", i);
    }
}

2.事件(Event),让你明白傻瓜式的OnClick是怎么来的

好吧,我承认咱们.NET程序员很傻瓜,拖控件,然后OnClick一下完事,也怪微软封装做得太好了,才让那些嫉妒而又羡慕的JAVA程序员鄙视我们.NET程序员。其实我想说,我们的OnClick其实是不容易的,如果我们能真正了解其背后的机制,那我们.NET程序员就能更理直气壮地面对鄙视我们的JAVA程序员,今天我就来出出气,揭开OnClick背后的故事。

说起OnClick,就不得不说.net中的event事件了。

C#中的事件处理实际上是一种具有特殊签名的delegate,像下面这个样子:

public delegate void MyEventHandler(object sender, MyEventArgs e);

其中的两个参数,sender代表事件发送者,e是事件参数类。MyEventArgs类用来包含与事件相关的数据,所有的事件参数类都必须从 System.EventArgs类派生。当然,如果你的事件不含参数,那么可以直接用System.EventArgs类作为参数。

好了,咱们就以OnClick为例说说事件的实现吧。

//这里自定义一个EventArgs,因为我想知道Clicker
public class ButtonClickArgs : EventArgs
{
    public string Clicker;
}

public class MyButton
{
    //定义一个delegate委托
    public delegate void ClickHandler(object sender, ButtonClickArgs e);
    //定义事件,类型为上面定义的ClickHandler委托
    public event ClickHandler OnClick;

    public void Click()
    {
        //...触发之前可能做了n多操作
        //.....

        //这时触发Click事件,并传入参数Clicker为本博主ivy
        OnClick(this, new ButtonClickArgs() { Clicker = "ivy" });
    }
}

public class Program
{
    public static void Main()
    {
        MyButton btn = new MyButton();

        //注册事件,把btn_OnClick方法压入事件队列,
        //可以+=多个,这里简单点就压入一个吧。
        btn.OnClick += new MyButton.ClickHandler(btn_OnClick);
    }

    //怎么看到这个函数很熟悉吧,就是你原来双击button自动产生的代码
    public static void btn_OnClick(object sender, ButtonClickArgs e)
    {
        Console.WriteLine("被点击了!");
    }
}

3.总结

上面只是讲了delegate和event的皮毛,但十分基础,希望各位能理解,别再被JAVA程序员欺负了,赶紧提高吧,别老是双击按钮了,还是写一句

btn.OnClick += new MyButton.ClickHandler(btn_OnClick);

显得你专业那,让那些JAVA程序员明白,哥的OnClick也是有水平的!

原文地址 : http://www.itivy.com/ivy/archive/2011/8/5/csharp-delegate-and-event.html

时间: 2024-08-06 15:39:22

重温委托(delegate)和事件(event)的相关文章

关于C# 委托(delegate)与事件(event)的用法及事例

C#中的委托和事件对于新手可能会有一点难理解,所以先从一个小例子入手,以便能更好的理解其如何使用.有一个学生每天定闹钟在早上6点起床,所以当每天早上6点的时候,闹钟就会响起来,从而学生才会按时起床. 上面例子实际上包括2个类,一个是学生类(Student),一个是闹钟类(Ring).此时,让我们仔细想想,当闹钟到点后如何通知学生呢?当然不要说,闹钟响了,学生能听到这样的话23333,现在是写程序,一切用程序说话.也就是说当时间到了,闹钟类里应该有个给学生发消息的方法(OnSendMessage(

C#中的委托(Delegate)和事件(Event)

C#中的委托(Delegate)和事件(Event) 2007-11-30 11:40:00 分类: 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式——观察者(Observer)有一个参考. 委托和事件应该是C#相较于C++等之前的非托管的语言提出的一个新的术语(term).“旧瓶装新酒”这样的描述似乎有些“贬义”,但确实是这样.委托也好,事件也好最初的起源是C/C++中的函数指针,关于函数指针的简单介绍可以参见我以前的一篇<C/C++中指向函数的

【温故知新】c#事件event

从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以通过事件向其他类或对象通知发生的相关事情. 发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”. event 关键字用于在发行者类中声明事件. 定义非常明确,通过事件向其他类或对象通知发生的相关事情,用来实现的观察者模式. 还是通过之前的代码例子,看看声明delegate和ev

事件和委托(Event vs. Delegate)-事件阉割版的Delegate

引言 关于事件和委托的文章看过很多,但总是记不完整.尤其是在给别人讲解的时候总是很零碎,所以在此整理一下,也供大家参考,很请大家不吝赐教. 本文从一个子类如何触发基类的事件(Event),引出事件和委托的共性和区别.再简单分析下背后原因,深层原因也给大家提供了部分参考资料.欢迎大家留言讨论.   问题 "如果我想在子类里触发父类的事件(Event)应该如何实现?"(可以先自己做下或者想下,再继续看您的做法是否也曾有我碰到技术误区)   问题分解为两步: 父类定义了一个事件(Event)

【Unity|C#】基础篇(8)——委托(Delegate)/ 事件(Event)

[学习资料] > 在线文档 官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/ 菜鸟教程(高级教程):https://www.runoob.com/csharp/csharp-tutorial.html > 视频教程 腾讯学院.Siki学院         > 书籍 <C#图解教程>(第13~14章):https://www.cnblogs.com/moonache/p/7687551.html [学习内容] > 菜

C#:代表(delegate)和事件(event) (转)

代表(delegate): 它是C#语言里面的函数指针,代表可以指向某一个函数,在运行的时候调用这个函数的实现.下面来看看它的实现步骤: 声明一个delegate对象. 实现和delegate具有相同参数和返回值的函数实现(可以是静态和非静态的). 产生一个delegate对象的时候,把你刚刚实现的函数作为参数传给他的构造函数. 请看下面例子: using System;using System.Collections.Generic;using System.Text; namespace U

事件委托和JQ事件绑定总结

事件委托: 比喻:事件委托的事例在现实当中比比皆是.比如,有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托给前台MM代为签收.现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递).前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款.这种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台MM也会在收到寄给新员工的快递后核实并代为签收. 实现原理:我们知道,DOM在为页面中的每个元素分派事

javascript 事件委托 和jQuery事件绑定on、off 和one

一. 事件委托什么是事件委托?用现实中的理解就是:有100 个学生同时在某天中午收到快递,但这100 个学生不可能同时站在学校门口等,那么都会委托门卫去收取,然后再逐个交给学生.而在jQuery 中,我们通过事件冒泡的特性,让子元素绑定的事件冒泡到父元素(或祖先元素)上,然后再进行相关处理即可.如果一个企业级应用做报表处理,表格有2000 行,每一行都有一个按钮处理.如果用之前的.bind()处理,那么就需要绑定2000 个事件,就好比2000 个学生同时站在学校门口等快递,不断会堵塞路口,还会

C#事件(event)解析

事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于windows消息处理机制的,只是封装的更好,让开发者无须知道底层的消息处理机制,就可以开发出强大的基于事件的应用程序来. 先来看看事件编程有哪些好处. 在以往我们编写这类程序中,往往采用等待机制,为了等待某件事情的发生,需要不断地检测某些判断变量,而引入事件编程后,大大简化了这种过程: - 使用事件,可以很方