c#基础——事件

引文:http://www.cnblogs.com/OpenCoder/archive/2009/09/23/1572646.html

c#事件

了解委托之后,就可以来谈谈事件了,C#事件是什么?

c#事件的定义和委托的声明是如此的相似:

event <委托类型> 事件名

例子:public event CheckDelegate checkEvent;

上面的例子声明了个事件叫checkEvent你会发现它只比声明委托实例前多了个关键字event

声明了事件后就可以实例化事件,注册函数到事件,解除事件函数注册其方法和委托的步骤如出一辙:

例子:checkEvent+=new CheckDelegate(CheckMod);//将函数CheckMod注册到事件checkEvent上

checkEvent+=CheckMod;//.net 2.0开始支持这种方法

checkEvent-=newCheckDelegate(CheckMod);//将函数CheckMod解除对事件checkEvent的注册

checkEvent-=CheckMod;//.net 2.0开始支持这种方法

从种种迹象都可以看出事件和委托实例是那么的相似,那么为什么不直接用委托还要用到事件呢?其实事件就是对委托的封装,就如同c#类中属性对字段的封装一样,其封装后可以在委托上封装更复杂的逻辑,下面我们来看c#中事件的两种声明方式,来了解事件对委托的封装

隐式声明事件

这种方式声明事件很简单,就如同声明委托实例一样:

event <委托类型> 事件名;

例子:public event CheckDelegate checkEvent;

我们用反射机制来看看这样声明的事件里面装的到底是什么东西

我们可以看到在事件被编译后自动生成了个private的委托实例checkEvent和两个函数add_checkEvent和remove_checkEvent,这两个函数分别对应事件的+=/-=操作,另外可以看到在声明了事件后的确是产生了一个和事件同名私有的委托实例checkEvent,对事件的+=/-=操作都会反映在这个同名委托实例checkEvent上,所以可以在定义事件的类里面直接调用checkEvent()来执行注册函数和对checkEvent使用=号重新赋值,实际上这里操作的并不是checkEvent事件,而操作的是同名委托实例checkEvent,因此隐式声明的事件,其实就是由一个委托实例和两个函数封装而成,所有的操作最终都反映在委托实例上。

(这里我补充下我的个人理解:事实上在一个类的内部是无法定义一个事件后又定义一个和事件同名的委托实例的,如果你在本例中尝试再定义CheckDelegate checkEvent,编译的时候会报错并提示已经定义了名叫checkEvent的委托,原因是因为事件本来就是一种特殊的委托实例(不管是隐式或显式声明的事件都是这样),因此定义和事件同名的委托实例会报错,所以我个人认为.net在编译的时候会把隐式声明的事件编译成为委托实例(和事件同名),本例中的checkEvent事件在编译后也不再是事件转而被编译成了checkEvent委托实例,否则又怎么可能在定义事件的类的内部可以执行事件和对事件赋值呢(这里大家可以看看我给的显式声明事件的例子,那里面有说到),唯一的解释就是隐式声明的事件其实就是委托实例)显式声明事件

其实显示声明事件就是要自己来手动实现隐式声明事件的一个委托实例

和两个函数:

event <委托类型> 事件名

{

add

{

//将函数注册到自己定义的委托实例

}

remove

{

//解除函数对自己定义的委托实例的注册

}

}

例子:private CheckDelegate _checkDelete;

public event CheckDelegate checkEvent

{

add

{

_checkDelete = Delegate.Combine(_checkDelete, value) as CheckDelegate;

}

remove

{

_checkDelete = Delegate.Remove(_checkDelete, value) as CheckDelegate;

}


//Delegate.Combine和Delegate.Remove是.net库函数,作用是合并委托实例注册函数和移除委托实例注册函数并返回合并和移除后的委托实例,具体解释请查阅MSDN

我们再用反射机制查看显式声明事件编译后的代码

可以看到显示声明事件的代码编译后和隐式声明事件的代码几乎相同,只不过这里我们自己定义了事件操作委托实例_checkDelete。另外显式声明的事件不支持直接调用,就算在定义事件的类里面也不能直接调用显式声明的事件(checkEvent();//这样会报错),应该调用事件委托实例(_checkDelete();)。


参考博客:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx


简书代码的阅读性还是很差的。不适合写有含有代码的文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容