一、开篇忏悔

对自己最拿手的编程语言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会指向无效地址或者越界地址。

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

第一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
     }
}

再来一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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为例说说事件的实现吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//这里自定义一个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点击了!");
    }
}

好了,我想这个例子各位看官看了应该能懂event了,不懂得现在右手打左手2下,不管你懂不懂,我反正是懂了。

四、总结

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

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

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

好了,写到这里,各位晚安,祝大家做个好梦!

From : http://www.itivy.com/ivy/archive/2011/8/5/csharp-delegate-and-event.html

终于会用c#中的delegate(委托)和event(事件)了的更多相关文章

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

    原文 : http://www.cnblogs.com/zhangchenliang/archive/2012/09/19/2694430.html 一.开篇忏悔 对自己最拿手的编程语言C#,我想对你 ...

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

    知识只有经过整理才能形成技能 整个章节分布简介请查看第一篇 内容目录 一.概述 二.解析委托知识点 1.委托本质 2.委托的使用 3.委托意义 逻辑解耦,减少重复代码 代码封装支持扩展 匿名方法和La ...

  3. C#中的委托 Delegate(委托 也叫代表,代表一类方法)

    1. 委托类似与 C或C++中的函数指针,但委托是 面向对象的,并且是类型安全的 详情可查看官方文档:https://msdn.microsoft.com/en-us/library/ms173172 ...

  4. 线程中的samaphore信号量及event事件

    一.信号量 samaphore: 在程序中意思为同时允许几个线程运行,比如我们去水上乐园的滑梯玩时,有四个滑梯,每一个滑梯上当没有人在中间玩滑下去时才允许上人,四个滑梯1,2,3,4,同时最多四个人, ...

  5. Python 中Semaphore 信号量对象、Event事件、Condition

    Semaphore 信号量对象 信号量是一个更高级的锁机制.信号量内部有一个计数器而不像锁对象内部有锁标识,而且只有当占用信号量的线程数超过信号量时线程才阻塞.这允许了多个线程可以同时访问相同的代码区 ...

  6. [转] C#中的delegate 和 event

    转至:here 终于会用c#中的delegate(委托) 作者:qq826364410 引言 Delegate是Dotnet1.0的时候已经存在的特性了,但由于在实际工作中一直没有机会使用Delega ...

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

    c#中的delegate(委托)和event(事件) 一.delegate是什么东西? 完全可以把delegate理解成C中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能 ...

  8. ios中关于delegate(委托)的使用心得

    ios中关于delegate(委托)的使用心得 分类: iOS开发2012-05-15 10:54 34793人阅读 评论(9) 收藏 举报 iosuiviewtimerinterfaceprinti ...

  9. 对于新手用c#中的delegate(委托)和event(事件)

    一.delegate到底是什么东西 delegate允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作参数传递.delegate既可以引用静态函数 ...

随机推荐

  1. javascript有用小技巧—实现分栏显示

    记得给师哥师姐測试考试系统的时候,看到他们的考试页面能够实现隐藏左边的考生信息部分,当时认为好高大上.好人性化. 如今学了javascript,我也能实现这个功能了,以下来显摆一下. 1.页面设计: ...

  2. HDU 1069 Monkey and Banana(DP 长方体堆放问题)

    Monkey and Banana Problem Description A group of researchers are designing an experiment to test the ...

  3. Android 深入解析光传感器(二)

    光线传感器演示1        讲了一大堆的理论,那么以下的样例就来展示一下光线感应器的使用.为什么充分展现光感的用法,我这个样例写的很easy,仅仅写了使用光感必须的代码,然后用了几个textVie ...

  4. 获取activity的根视图

    Activity的根视图是什么? Activity所谓的根视图,就是Activity的最底层的View,也就是在Acitivty创建的时候setContentView的时候传入的View. 如何获取到 ...

  5. 【Nginx】磁盘文件写入飞地发

    文章继续.什么时候Nginx当用户请求一个文件,这将无法读取该文件的内容加载到内存,然后从内存发送,但电话sendfile况下,从内核直接发送出去.这样做显然效率要更高.Nginx也为我们封装好了一系 ...

  6. 【Android基础】单元测试的配置

    1.在AndroidManifest清单文件中进行配置 <application android:allowBackup="true" android:debuggable= ...

  7. ORACLE—002:Create创作型

    --用于工作的积累SQL ORACLE另外还有的类型.储过程.函数等的输入输入出. 以下看下创建. 使用方法 CREATE OR REPLACE TYPE 类型名称 AS OBJECT(  字段1   ...

  8. iOS_67控件外观对照

    iOS 7 button无边框,操作栏透明,控制器全屏 Tab Bar 对照 iOS 7                                                         ...

  9. java提高篇(十三)-----字符串

          可以证明,字符串操作是计算机程序设计中最常见的行为. 一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为f ...

  10. Java 理论与实践: 正确使用 Volatile 变量(转)

    Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”:与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少, ...