事件是类型的一个成员,用来在事情发生的时候通知注册了该事件的成员。

事件和观察者模式十分的相似,所以事件应该提供如下几种能力

1.能让对象的方法登记对他的关注

2.能让对象的方法取消对他的关注

3.能在事件发生的时候将通知发送给方法

在C#中的某个类中定义一个事件使用如下语句

public event EventHandler<EventArgs> SomeEvent;

其中EventHandler<EventArgs>是一泛型委托,在System命名空间下,委托的定义为

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
其中TEventArgs是这个委托所需要定义的参数,应该从System.EventArgs派生,不过你要是在想传一个字符串什么的,确实也是没问题的。一般这个变量中会传递事件希望通知给事件订阅者的一些信息。
我们可以看见这个类什么都没有做,只是提供一种约束
    // 摘要:
// System.EventArgs 是包含事件数据的类的基类。
[Serializable]
[ComVisible(true)]
public class EventArgs
{
// 摘要:
// 表示没有事件数据的事件。
public static readonly EventArgs Empty; // 摘要:
// 初始化 System.EventArgs 类的新实例。
public EventArgs();
}

下面我们来设计如下常景。
我们需要一个自动回复机器人,当接收到信息中心传递来的消息后,我们需要回复'xxx,你好',xxx这个是发消息人,将通过EventArgs传过来
首先,我们需要一个信息中心类,有登记方法,取消登记,通知的功能
internal class MessageSender
{
//一个类型为委托的私有字段,这个字段维护了一个委托列表
private EventHandler<NewMessageEventArgs> m_NewMessage;
//一个事件成员,用来给外部方法登记和取消登记
public event EventHandler<NewMessageEventArgs> NewMessage
{
add
{
m_NewMessage += value;
}
remove
{
m_NewMessage -= value;
}
}
//通知订阅对象,有新消息到了
public void OnNewMessage(NewMessageEventArgs e)
{
if(m_NewMessage!=null)
{
m_NewMessage(this,e);
}
}
}

还需要定义一个事件参数类,用来传递消息发送人的名称

 //EventArgs类,携带发送消息的人的名称传递给事件订阅者
internal sealed class NewMessageEventArgs:EventArgs
{
private readonly String m_from;
public String From{get;}
}

现在定义两个消息订阅类,分别提供各自的方法来订阅消息发送事件

internal class JustSayHello
{
public JustSayHello(MessageSender ms)
{
ms.NewMessage += sayHello;
}
private void sayHello(object sender,NewMessageEventArgs e)
{
Console.WriteLine("Hello {0}",e.From);
}
public void unRegistered(MessageSender ms)
{
ms.NewMessage -= sayHello;
}
}
internal class JustSayAloha
{
public JustSayAloha(MessageSender ms)
{
ms.NewMessage += sayAloha;
}
private void sayAloha(object sender, NewMessageEventArgs e)
{
Console.WriteLine("Aloha {0}", e.From);
}
public void unRegistered(MessageSender ms)
{
ms.NewMessage -= sayAloha;
}
}

然后在静态方法中调用,

static void Main(string[] args)
{
MessageSender ms = new MessageSender();
NewMessageEventArgs e = new NewMessageEventArgs("ailijima");
JustSayHello jsh = new JustSayHello(ms);
JustSayAloha jsa = new JustSayAloha(ms);
ms.OnNewMessage(e);
Console.Read();
}

输出如下

CLR VIA C#事件的更多相关文章

  1. CLR 显示实现事件 EventSet内部管理一个字典

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...

  2. 有关CLR的初学小整理(可能理解不深刻,望大牛指出)

    1. .Net程序通过CLR去加载运行管理代码, 加载CLR的进程成为“宿主”,通常操作系统加载. 加载CLR的进程也可以为某个DLL,也成为“宿主” 2. 宿主接口使宿主能够对运行库的更多方面进行控 ...

  3. NEsper使用的事件类型 z

    NEsper使用的事件类型来描述事件的类型信息.你的应用在启动时可能预先配置定义事件类型,或者在运行时通过API或EPL语法动态的增加事件类型. EPL中的create schema 的语法允许在运行 ...

  4. .NET 中的委托

    1.1.1 定义 委托是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的行为.委托方法的使用可以像其他任何方法一样,具有参数和返回值,如下面的示例所示: //Code in C# ...

  5. 动手实现一个适用于.NET Core 的诊断工具

    前言 大家可能对诊断工具并不陌生,从大名鼎鼎的 dotTrace,到 .NET CLI 推出的一系列的高效诊断组件(dotnet trace,dotnet sos,dotnet dump)等, 这些工 ...

  6. 《快来为你的 .NET 应用加个监控吧!》更新版本啦

    目录 导读 三种方式处理监控数据 主动推送 ASP.NET Core 自定义URL .NET diagnostics 自定义监控指标 导读 CZGL.ProcessMetrics 是一个 Metric ...

  7. .NET周报【10月第3期 2022-10-25】

    国内文章 聊一聊被 .NET程序员 遗忘的 COM 组件 https://www.cnblogs.com/huangxincheng/p/16799234.html 将Windows编程中经典的COM ...

  8. JNI详解---从不懂到理解

    转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...

  9. CLR via C#深解笔记五 - 事件

    事件处理实际上是一种具有特殊签名的delegate, 像这个样子:public delegate void EventHandler(object sender, EventArgs e);   类型 ...

随机推荐

  1. PHP-query 的用法

    Jquery Jquery实际上相当于一个升级版的JS,Jquery里面封装了很多的东西,Jquery的功能要比JS强大,用起来比JS方便.Jquery和JS都属于JS,只不过Jquery是封装了一个 ...

  2. python数据结构与算法——二叉树结构与遍历方法

    先序遍历,中序遍历,后序遍历 ,区别在于三条核心语句的位置 层序遍历  采用队列的遍历操作第一次访问根,在访问根的左孩子,接着访问根的有孩子,然后下一层 自左向右一一访问同层的结点 # 先序遍历 # ...

  3. 2016HUAS_ACM暑假集训2B - The Suspects(感染者)

    并查集初步应用,还不是很熟练.并查集两个主要函数:Union和Find.Union通常把两条不连通的支路使其连通:Find用来查找根节点,必要的要进行路径压缩. 大致题意:0号学生是默认的感染者,在M ...

  4. 渴切API参考手册

    渴切:是国内优秀的开源css框架. 渴切是一个开源中文 (X)HTML/CSS 框架 ,它的目的是减少你的css开发时间.它提供一个可靠的css基础去创建你的项目,能够用于网站的快速设计,通过重设和重 ...

  5. MVC缓存OutputCacheAttribute 类提高网站效率(转)

    原文转自:http://www.cnblogs.com/iamlilinfeng/p/4419362.html 命名空间:  System.Web.Mvc 程序集:  System.Web.Mvc(在 ...

  6. 使用pt-stalk分析MySQL的性能波动 (转)

    简介 在MySQL服务器出现短暂(5~30秒)的性能波动的时候,一般的性能监控工具都很难抓住故障现场,也就很难收集对应较细粒度的诊断信息.另外,如果这种波动出现的频率很低,例如几天才一次,我们也很难人 ...

  7. HackerRank "Kruskal (MST): Really Special Subtree"

    Kruskal Algorithm is based on Union-Find - quite intuitive. #include <vector> #include <ios ...

  8. java 线程的优先级

    //线程的优先级 //线程1 class xc1 implements Runnable{ public void run(){ for(int i=0;i<20;i++){ System.ou ...

  9. springboot教程

    http://www.cnblogs.com/java-zhao/tag/spring-boot/ http://blog.csdn.net/liaokailin/article/category/5 ...

  10. 【原】安装mongo的php插件

    http://pecl.php.net/package/mongo https://github.com/mongodb/mongo-php-driver/tarball/master 1. 安装mo ...