终于会用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,因为我想知道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(事件)了 [转]的更多相关文章
- 终于会用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既可以引用静态函数 ...
随机推荐
- PHP 获取客户端用户 IP 地址
一般情况下可以使用以下代码获取到用户 IP 地址 echo 'User IP - '.$_SERVER['REMOTE_ADDR']; // 服务器在局域网的话,那么显示的则是内网IP .// 如果服 ...
- Leetcode 649.Dota2参议院
Dota2参议院 Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成.现在参议院希望对一个 Dota2 游戏里的改变作出决定.他们以一 ...
- Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发
接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...
- python 打印9*9乘法表
# -*- coding: utf8 -*- # Author:wxq 1. for i in range(1,10): for j in range(1,i+1): print "%d*% ...
- 【转】UGUI EventSystem
EventSystem The EventSystem is a way of sending events to objects in the application based on inpu ...
- 【Luogu】P4172水管局长(LCT)
题目链接 有个结论是x到y的路径上最长边权值等于最小生成树上最长边权值,于是问题转化为最小生成树. 再考虑把问题反过来,删边变成加边. 于是变成动态维护最小生成树,LCT可以做到. #include& ...
- Java注解解析-搭建自己的注解处理器(CLASS注解使用篇)
该文章是继Java注解解析-基础+运行时注解(RUNTIME)之后,使用注解处理器处理CLASS注解的文章.通过完整的Demo例子介绍整个注解处理器的搭建流程以及注意事项,你将知道如何去搭建自己的注解 ...
- nodeJS(2)深了解: nodeJS 项目架构详解(app.js + Express + Http)
简略了解:nodeJS 深了解(1): Node.js + Express 构建网站预备知识 环境: 环境: win7 + nodeJS 版本(node): 新建 nodeJS 项目: 名称为: te ...
- onbeforeunload 的使用
原文发布时间为:2008-10-20 -- 来源于本人的百度文章 [由搬家工具导入] onbeforeunload 可以在页面关闭,刷新,跳转时弹出提示信息,防止意外的跳转使得当前页的表单内容被清空。 ...
- UART接口介绍
1. 简介 UART, Universal Asynchronous Receiver-Transmitter, 通用异步收发传输器 UART协议规定了通信双方所遵守的规定,属于数据链路层RS232接 ...