终于会用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语言总学过吧,如果你学得不像我那么差的话,函数指针总用过吧,就算没用过总听说过吧,嗯,大胆的告诉你,你完全可以把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,因为我想知道Clickerpublic 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(事件)了 [转]的更多相关文章
- 终于会用c#中的delegate(委托)和event(事件)了
一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那今天就趁月黑风高的夜晚简单来谈谈delegate和e ...
- .NET进阶篇-语言章-2-Delegate委托、Event事件
知识只有经过整理才能形成技能 整个章节分布简介请查看第一篇 内容目录 一.概述 二.解析委托知识点 1.委托本质 2.委托的使用 3.委托意义 逻辑解耦,减少重复代码 代码封装支持扩展 匿名方法和La ...
- C#中的委托 Delegate(委托 也叫代表,代表一类方法)
1. 委托类似与 C或C++中的函数指针,但委托是 面向对象的,并且是类型安全的 详情可查看官方文档:https://msdn.microsoft.com/en-us/library/ms173172 ...
- 线程中的samaphore信号量及event事件
一.信号量 samaphore: 在程序中意思为同时允许几个线程运行,比如我们去水上乐园的滑梯玩时,有四个滑梯,每一个滑梯上当没有人在中间玩滑下去时才允许上人,四个滑梯1,2,3,4,同时最多四个人, ...
- Python 中Semaphore 信号量对象、Event事件、Condition
Semaphore 信号量对象 信号量是一个更高级的锁机制.信号量内部有一个计数器而不像锁对象内部有锁标识,而且只有当占用信号量的线程数超过信号量时线程才阻塞.这允许了多个线程可以同时访问相同的代码区 ...
- [转] C#中的delegate 和 event
转至:here 终于会用c#中的delegate(委托) 作者:qq826364410 引言 Delegate是Dotnet1.0的时候已经存在的特性了,但由于在实际工作中一直没有机会使用Delega ...
- c#中的delegate(委托)和event(事件)
c#中的delegate(委托)和event(事件) 一.delegate是什么东西? 完全可以把delegate理解成C中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能 ...
- ios中关于delegate(委托)的使用心得
ios中关于delegate(委托)的使用心得 分类: iOS开发2012-05-15 10:54 34793人阅读 评论(9) 收藏 举报 iosuiviewtimerinterfaceprinti ...
- 对于新手用c#中的delegate(委托)和event(事件)
一.delegate到底是什么东西 delegate允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作参数传递.delegate既可以引用静态函数 ...
随机推荐
- [python][django学习篇][3]创建django web的数据库模型
推荐学习博客:http://pythonzh.cn/post/8/ 博客或者web界面向用户展示内容,它需要从某个地方获取博客内容或者web界面内容,才能够展示出来.通常来说:某个地方指的就是数据库 ...
- 爬虫:Scrapy4 - Spiders
Spider 类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item).Spider就是定义爬取的动作以及分析某个网页(或者有些网 ...
- LFTP下载远程文件
拓展阅读: https://linux.cn/article-5460-1.html
- PAT1033
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及坏掉的那些键,打出的结果文字会是怎样? 输入格式: 输入在2行中分别给出坏掉的那些键.以及应该输入的文 ...
- Python机器学习数据挖掘工具sklearn安装和使用
python借助pip安装第三方库,所以首先确保电脑上已成功安装了pip. 安装sklearn前需要先安装numpy.scipy和pandas等库.安装的方式有两种: 一.前往python的组件库页( ...
- linux系统负载状态检查脚本
为了便于分析问题,编写了一个linux状态检查脚本,脚本可放置任意目录,脚本执行检测后会输出日志记录到当前目录下.直接执行脚本可用于一次检测,可通过日志进行分析.如果需要长时间监测,可执行-x参数,脚 ...
- 【bzoj2882】工艺 后缀自动机+STL-map
题目描述 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方 ...
- jquery.transform
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- angular 右击事件的写法
.directive('ngRightClick', function ($parse){ return function (scope, element, attrs){ var fn = $par ...
- linux下創建啓動圖標
Linux下如何为刚安装好的Eclipse在桌面建一个启动图标?(QtCreator 也可以类似去做). 首先:gedit /usr/share/applications/eclipse.des ...