看看可爱c#中的delegate(委托)和event(事件)用法好不好

一、开篇忏悔

对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那。好了,那今天就趁月黑风高的夜晚简单来谈谈delegate和event的简单用法吧,希望能给初学者带来帮助。PS:别像我那样学了几年c#到头来都不知道delegate和event怎么用。

二、delegate到底是什么东西

孩子,C语言总学过吧,如果你学得不像我那么差的话,函数指针总用过吧,就算没用过总听说过吧,嗯,大胆的告诉你,你完全可以把delegate理解成C中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作参数传递。不过delegate和函数指针还是有点区别的,delegate有许多函数指针不具备的优点。首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引 用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。其次,与函数指针相 比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法, 你无须担心delegate会指向无效地址或者越界地址。

有什么能比举个例子更能说明问题呢,代码才是硬道理,来吧,看几个例子吧:

第一个例子:

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);
     }
}

再来一个例子:

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);
    }
}

好了,以你的智商应该明白了delegate委托是怎么回事了,还不明白的自己左手打右手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("真贱,我居然被ivy点击了!");
    }
}
时间: 2024-08-03 09:52:43

看看可爱c#中的delegate(委托)和event(事件)用法好不好的相关文章

.NET进阶篇-语言章-2-Delegate委托、Event事件

知识只有经过整理才能形成技能 整个章节分布简介请查看第一篇 内容目录 一.概述 二.解析委托知识点 1.委托本质 2.委托的使用 3.委托意义 逻辑解耦,减少重复代码 代码封装支持扩展 匿名方法和Lambda表达式 异步多线程 多播委托 三.事件 四.总结 一.概述 先说下委托,委托我们也经常用到.详尽了解委托是必要的,不然在异步多线程的编程中会一头雾水.委托本质就是一个类,和我们平常定义的类没多大区别.只是这个类的作用的是描述一些方法,没有数据成员.一个委托定义了一类拥有同样返回类型和参数的方

javascript中window.event事件用法详解

转自http://www.jb51.net/article/32564.htm描述 event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生的过程中才有效. event的某些属性只对特定的事件有意义.比如,fromElement 和 toElement 属性只对 onmouseover 和 onmouseout 事件有意义. 例子下面的例子检查鼠标是否在链接上单击,并且,如果shift键被按下,就取消链接的跳转. 复制代码代码如下: <

delegate绑定多个事件

delegate绑定多个事件用法 比如: <div class="div">123</div> JS部分: $(document).delegate(".div","mouseenter mouseleave",function(e){ var type = e.type; if(type == "mouseenter"){ $(this).css("color","#ee

自定event事件之全局初始化中自动触发(二)

利用(一)组件:Y_GLOBAL_EVENT 场景:界面加载后在COMPONENTCONTROLLER触发自定义event事件 首先要搞懂WebDynpro启动时的hokeMethod执行顺序如下图: 从上至下,依次进行 从执行顺序中可以看出加载完VIEW视图之后,最后会执行COMPONENTCONTROLLER中的一个叫WDDOPOSTPROCESSING方法, 所以我们可以利用该方法将触发event. METHOD wddopostprocessing . wd_this->fire_tes

终于会用c#中的delegate(委托)和event(事件)了

一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那今天就趁月黑风高的夜晚简单来谈谈delegate和event的简单用法吧,希望能给初学者带来帮助.PS:别像我那样学了几年c#到头来都不知道delegate和event怎么用. 二.delegate到底是什么东西 孩子,C语言总学过吧,如果你学得不像我那么差的话,函数指针总用过吧,就算没用过总听说过吧,嗯,大胆的告诉你,你完全可以把delegate理

c#中的delegate(委托)和event(事件)

委托: 托付其他人做这件事   ,包括 托付自己  ,即  一个方法 可以  调用 没有关系的其他方法 , 也可以 将委托传递过去 ,回调自己的方法 ,且 可以自定义参数 ,非常方便 互相传值, 适合解耦 关系. 示例: public delegate void ChangeMoney(object s, int n);   // 用 delegate  声明委托 1. 调用 其他方法 售卖 页面添加商品,添加 的 商品 在另一个页面也能看见 . 售卖页面 类里面 定义委托: //定义一个委托 

终于会用c#中的delegate(委托)和event(事件)了 [转]

原文 : http://www.cnblogs.com/zhangchenliang/archive/2012/09/19/2694430.html 一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那今天 就趁月黑风高的夜晚简单来谈谈delegate和event的简单用法吧,希望能给初学者带来帮助.PS:别像我那样学了几年c#到头来都不知道 delegate和event怎么用. 二.delegate

c#中的泛型委托(@WhiteTaken)

今天学习一下c#中的泛型委托. 1.一般的委托,delegate,可以又传入参数(<=32),声明的方法为  public delegate void SomethingDelegate(int a); 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace delegate

List&lt;string&gt;中的泛型委托

我们先看List<T>.Sort().其定义是:public void Sort( Comparison<T> comparison ) 其要求传入的参数是Comparison<T> comparison.那我们看看Comparison<T> comparison 要求我们传入哪些参数.返回什么样的值. 查阅MSDN后,我们发现Comparison<T> 要求我们传入两个T的示例,即t1和t2:返回结果是整数,如果t1<t2返回-1,如果相