event
上一篇(http://canbeatle.iteye.com/blog/686201)我们通过IL查看了委托的实现方式。现在开始探讨event(事件)。
.NET Framework 可以广泛地将委托用于事件处理任务,如 Windows 或 Web 应用程序中的按钮 Click 事件。Java 中的事件处理通常通过实现自定义侦听器类完成,而 C# 开发人员则可以利用委托处理事件。事件的声明类似于具有委托类型的字段,区别在于事件声明前面有 event 关键字。事件通常被声明为public,但允许使用任何可访问性修饰符。下面的示例演示了 delegate 和 event 的声明。
// 声明委托
public delegate void CustomEventHandler(object sender,System.EventArgs e);
// 声明事件
public event CustomEventHandler CustomEvent;
事件委托是多路广播的,这意味着它们可以对多个事件处理方法进行引用。通过维护事件的已注册事件处理程序列表,委托为引发事件的类担当事件发送器的角色。下面的示例演示如何为多个函数订阅事件。EventClass 类包含委托、事件和调用事件的方法。请注意调用事件只能从声明该事件的类内部进行。然后,TestEvents 类使用 += 运算符订阅事件,并使用 -= 运算符取消订阅。调用 InvokeEvent 方法时,它将激发事件,所有订阅了该事件的函数也同步激发,如下面的示例所示:
public class EventClass
{
// 声明委托
public delegate void CustomEventHandler(object sender, System.EventArgs e);
// 声明事件
public event CustomEventHandler CustomEvent;
public void InvokeEvent()
{
// 调用事件,注意,一但调用,就是触发所有的event,而不是第一个
CustomEvent(this, System.EventArgs.Empty);
/*另外一种调用方式 if (CustomEvent != null)
{
foreach (Delegate delItem in CustomEvent.GetInvocationList())
{
delItem.DynamicInvoke(this, System.EventArgs.Empty);
}
}
*/
}
}
class TestEvents
{
private static void CodeToRun(object sender, System.EventArgs e)
{
System.Console.WriteLine("CodeToRun is executing");
}
private static void MoreCodeToRun(object sender, System.EventArgs e)
{
System.Console.WriteLine("MoreCodeToRun is executing");
}
static void Main()
{
EventClass ec = new EventClass(); ec.CustomEvent += new EventClass.CustomEventHandler(CodeToRun);
ec.CustomEvent += new EventClass.CustomEventHandler(MoreCodeToRun);
System.Console.WriteLine("First Invocation:"); ec.InvokeEvent();
ec.CustomEvent -= new EventClass.CustomEventHandler(MoreCodeToRun);
System.Console.WriteLine("\nSecond Invocation:");
ec.InvokeEvent();
}
}
这是反汇编的代码结构:
通过ildasm反汇编可以看到 public event CustomEventHandler CustomEvent 声明了两个成员
.field private class EventDelegateTest.EventClass/CustomEventHandler CustomEvent
和对CustomEvent的一个包装:
.event EventDelegateTest.EventClass/CustomEventHandler CustomEvent
{
.addon instance void EventDelegateTest.EventClass::add_CustomEvent(class EventDelegateTest.EventClass/CustomEventHandler)
.removeon instance void EventDelegateTest.EventClass::remove_CustomEvent(class EventDelegateTest.EventClass/CustomEventHandler)
}
其中在CustomEvent上的+=和-=分别对应add_CustomEvent和remove_CustomEvent操作。
下一篇,从网上转了一篇文章来更深入的探讨delegate和event。
- 大小: 98.5 KB
分享到:
相关推荐
委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就...
C#中的事件和委托(Delegate,Event)
从序言中,大家应该对委托和事件的重要性有点了解了吧,虽然说我们现在还是能模糊,但是从我的大白话系列中,我会把这些概念说的通俗易懂的。首先,我们还是先说说委托吧,从字面上理解,只要是中国人应该都知道这个...
主要通过进度条进行解释 利用委托将界面和业务层分离的方法
我自己写的一个博文配的例子,博文地址待审核后加上去。
Delegate.Event.ThreadDelegate.EvDelegate.Event.Threadent.Thread
NET Delegate Event Model vs COM Connection PointsNET事件模型和COM连接点
Delegate Event Study 委托和事件学习
事件触发最简单例子event delegate
delegate和event入门使用实例,VS2012控制台应用程序,在VS其他版本中可新建控制台项目,将类加进去的)
本文实例讲述了C#事件处理和委托event delegate,分享给大家供大家参考。具体方法如下: 以下仅仅是用最简单的方式表示事件,实际应用可能是不同窗体之间相互通知某些操作,达到触发。 首先声明一个degate的 ...
委托的简单理解: 参考了一些资料整合起来 写了个小程序,使您能充分理解和使用————delegate ,委托
Delegate '委托,带参数的方法,多线程,可以轻松在线程中传递参数,获取返回值.
CSharp_Delegate C#委托 本人博客中的示例代码
网上有很多关于C++ delegate机制的文章,但都讲的是函数指针的内容,上周就C++中实现C#的delegate机制的问题研究了好几天,查看了很多相关资料,才解决了问题,现将我写的C++ delegate测试程序贴出来,希望能帮到有...
/// 1:关键字不同,委托是关键字delegate 事件是event /// 2:定义不同:委托是有参数的,事件是没参数的,不需要写() /// 3:绑定不同:委托是可以用=号把方法名称直接赋值,事件是要用+=的方式赋值 /// 4: ...
委托delegate invoke的简单源代码,适合委托初学者!
最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt C#多线程编程-多细全.txt C#多线程编程简单实例.txt C#多线程窗体控件安全访问....
关于C#委托和事件的实验程序!
从简单定义委托,简单事件,到复杂定义委托,复杂事件,定义线程,委托和事件结合使用,委托和线程结合