转载地址:http://www.cnblogs.com/zhangchenliang/archive/2012/09/19/2694430.html

一、开篇忏悔

对自己最拿手的编程语言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也是有水平的!

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

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

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

    第一个例子: public class DelegateTest {// 声明delegate对象 public delegate void CompareDelegate(int a,int b); ...

  2. 【C#学习】delegate(委托) 和 event(事件)

    C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变.在C#中方法不能作为参数直接传递,必须 ...

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

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

  4. C#学习基本概念之关键字---delegate(委托)

    委托类型的声明与方法签名相似,  有一个返回值和任意数目任意类型的参数: public delegate void TestDelegate(string message); public deleg ...

  5. 在C#中使用代理的方式触发事件 (委托和事件 ) (转)

    From:  http://www.cnblogs.com/gzhnan/articles/1859477.html 在C#中使用代理的方式触发事件 (委托和事件 ) 事件(event)是一个非常重要 ...

  6. delegate委托

    delegate委托: 三个概念: C# 中的委托类似于 C 或 C++ 中的函数指针. 委托是面向对象.类型安全的,并且是安全的. 委托和接口的类似之处是:它们都允许分隔规范和实现. 一个原则: 被 ...

  7. Csharp关键字----delegate(委托)

    Delegate类简介 ------------------------      命名空间:System 程序集:mscorlib(在 mscorlib.dll 中) 委托(Delegate)类是一 ...

  8. C# Delegate(委托)与多线程

    C# Delegate(委托)与多线程 很多时候写windows程序都需要结合多线程,在.net中用如下得代码来创建并启动一个新的线程.     public void ThreadProc();   ...

  9. vue学习:事件传递(冒泡和捕获),事件委托,jquery中的事件委托,$event 获取元素,vue事件修饰符

    事件传递 ----冒泡和捕获 DOM事件标准定义了两种事件流,这两种事件流分别是捕获和冒泡. 和许多Web技 术一样,在它们成为标准之前,Netscape和微软各自不同地实现了它们.Netscape选 ...

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

    转自:http://blog.chinaunix.net/uid-576762-id-2733751.html 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设 ...

最新文章

  1. nyist-508(余数求和)
  2. WeMos-D1R2的使用
  3. php 发送delete请求,PHP中使用CURL实现GET、POST、PUT、DELETE请求
  4. 正则表达式的几种字符判断(包括数字,字母组合等)
  5. Java 学生成绩管理系统
  6. Babuk/AtomSilo/LockFile勒索软件免费解密工具
  7. 顺序表的类型定义与基本操作
  8. access怎么做批注_怎样做批注
  9. phyton做九九乘法表
  10. 公司来了个首席架构师,服务器缩减一半,性能反而提升7倍!跪了...
  11. android 平板z97,生命在于折腾 iGame Z97也能玩Android
  12. centos安装LDAP即配置
  13. 小水管也要有尊严 网络限速优化实际案例
  14. 快速了解元宇宙的 7 层产业链
  15. 【论文翻译】:PyramidBox: A Context-assisted Single Shot Face Detector
  16. ccdisk1.8完美测试版
  17. 重阳节绘画软件测试,幼儿园重阳节绘画.docx
  18. 达索CATIA许可证(License)管理使用和优化,解决许可不够用
  19. python xml第三方库_Python-XML库
  20. Java2017ci怎么导入_CI框架(CodeIgniter)实现的导入、导出数据操作示例

热门文章

  1. 【图像隐写】基于matlab GUI LSB图像隐写【含Matlab源码 713期】
  2. 使用lstm实现文本生成_Spamilton:使用LSTM和Hamilton歌词生成文本
  3. 数据合并concat
  4. qfile.remove 删除已经被加载的文件_Milvus数据管理:删除的实现原理
  5. 计算机法宝,计算机专业英语学习法宝.doc
  6. pythontab_PythonTab 中文网简介
  7. java构造器基本语法_Java语言中的定义变量、构造函数
  8. vue-cli 最强指南
  9. struts2初步学习路线
  10. 依旧是输入输出(存字符矩阵,空格,换行)