All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
Sys.ScriptLoader与JS加载进度条的实现_.net资料_编程技术
PHP安全基础,注射基础经验技巧汇总篇_php资料_编程技术
学习:如何在HTML中引用XML数据_[XML教程]
SQL Server连接失败错误分析与排除_[SQL Server教程]
解决方案:用户sa登录失败_[SQL,Server教程]
实例详细讲解PHP连接调用数据库的方法_php资料_编程技术
总结SQL Server与Access语法小差异_[SQL Server教程]
PHP,存取,MySQL,数据库的一个例子_php资料_编程技术
ASP.NET2.0中配置文件的加密与解密_[Asp.Net教程]
创建一个简单的Delphi程序
Reading number is top 10 pictures
Catch prostitution woman in China
mythology hero1
什么叫国家
各种囧况!玩游戏最不喜欢出现的十件事
The service WaLiangGe Chinese aircraft carrier1
Chinese paper-cut grilles art appreciation8
鸡也看毛片
India's national beauty of the college students
A man's favorite things1
The world's top ten most beautiful railway station2
Download software ranking
The Bermuda triangle3
Unix video tutorial15
WebService在.NET中的实战应用教学视频 → 第1集
电车之狼R
卡丁车单机版
Wild things 2
网络管理员第三版
功夫熊猫2(上集)
传奇私服架设教程-chm
徐若瑄成名作“魔鬼天使”
qq published in(发表于) 2014/7/11 9:18:48 Edit(编辑)
C#中事件的概念以及以及事件实例

C#中事件的概念以及以及事件实例

C#中事件的概念以及以及事件实例

事件

事件是类在发生其关注的事情时用来提供通知的一种方式。例如,封装用户界面控件的类可以定义一个在用户单击该控件时发生的事件。控件类不关心单击按钮时发生了什么,但它需要告知派生类单击事件已发生,然后,派生类可选择如何响应。

C# 是一个完全面向对象组件的程序,所以允许编写自定义的事件。实际上,事件就是一个回呼(callback)的函数指针,在C#中是通过delegate达成的。

在.NET的事件模型中,主要的角色有事件发行者和事件订阅者。事件的发行者是触发事件的对象,而事件的订阅者指的是在某种事件发生时被通知的人。

当发生与某个对象相关的事件时,类和结构会使用事件将这一对象通知给用户。这种通知即称为“引发事件”。引发事件的对象称为事件的源或发送者。对象引发事件的原因很多,响应对象数据的更改、长时间运行的进程完成或服务中断。例如,一个对象在使用网络资源时如果丢失网络连接,则会引发一个事件。表示用户界面元素的对象通常会引发事件来响应用户操作,如按钮单击或菜单选择。信息网站源代码

如果要在程序中使用事件,就必须先声明事件。下面来声明一个事件,代码如下:

public delegate void MrEventDelegate(object sender, System.EventArgs e);
在.NET Framework 中事件的签名中,通常第一个参数为引用事件源的对象,第二个参数为一个传送与事件相关的数据的类。但是,在C#中并不强制使用这种形式,只要事件签名返回 void,其他方面可以与任何有效的委托签名一样。

向类中添加事件需要使用 event 关键字,并提供委托类型和事件名称。例如:

public class EventSend

{

public event MrEventDelegate TestEvent;

private void RaiseTestEvent() { /* ... */ }

}

事件可标记为public、private、protected、internal 或protectedinternal。这些访问修饰符定义类的用户访问事件的方式。

若要引发事件,类可以调用委托,并传递所有与事件有关的参数。然后,委托调用已添加到该事件的所有处理程序。如果该事件没有任何处理程序,则该事件为空。因此在引发事件之前,事件源应确保该事件不为空以避免NullReferenceException。若要避免争用条件(最后一个处理程序会在空检查和事件调用之间被移除),在执行空检查和引发事件之前,事件源还应创建事件的一个副本。下面的代码实现了触发MrEventDelegate事件:信息网站源代码

private void RaiseTestEvent()

{

MrEventDelegate temp = TestEvent;

if (temp != null)

{

temp(this, new System.EventArgs());

}

}

每个事件都可以分配多个处理程序来接收该事件。这种情况下,事件自动调用每个接收器;无论接收器有多少,引发事件只需调用一次该事件。

要接收某个事件的类,可以创建一个方法来接收该事件,然后向类事件自身添加该方法的一个委托。这个过程称为“订阅事件”。

首先,接收类必须具有与事件自身具有相同签名(如委托签名)的方法。然后,该方法(称为事件处理程序)可以采取适当的操作来响应该事件。例如:

public class EventReceiver

{

public void ReceiveTestEvent(object sender, System.EventArgs e)

{

System.Console.Write("Event received from ");

System.Console.WriteLine(sender.ToString());

}

}

每个事件可有多个处理程序。多个处理程序由源按顺序调用。如果一个处理程序引发异常,还未调用的处理程序,则没有机会接收事件。因此,建议事件处理程序迅速处理事件并避免引发异常。



添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.