CLR VIA C#事件
事件是类型的一个成员,用来在事情发生的时候通知注册了该事件的成员。
事件和观察者模式十分的相似,所以事件应该提供如下几种能力
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#事件的更多相关文章
- CLR 显示实现事件 EventSet内部管理一个字典
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...
- 有关CLR的初学小整理(可能理解不深刻,望大牛指出)
1. .Net程序通过CLR去加载运行管理代码, 加载CLR的进程成为“宿主”,通常操作系统加载. 加载CLR的进程也可以为某个DLL,也成为“宿主” 2. 宿主接口使宿主能够对运行库的更多方面进行控 ...
- NEsper使用的事件类型 z
NEsper使用的事件类型来描述事件的类型信息.你的应用在启动时可能预先配置定义事件类型,或者在运行时通过API或EPL语法动态的增加事件类型. EPL中的create schema 的语法允许在运行 ...
- .NET 中的委托
1.1.1 定义 委托是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的行为.委托方法的使用可以像其他任何方法一样,具有参数和返回值,如下面的示例所示: //Code in C# ...
- 动手实现一个适用于.NET Core 的诊断工具
前言 大家可能对诊断工具并不陌生,从大名鼎鼎的 dotTrace,到 .NET CLI 推出的一系列的高效诊断组件(dotnet trace,dotnet sos,dotnet dump)等, 这些工 ...
- 《快来为你的 .NET 应用加个监控吧!》更新版本啦
目录 导读 三种方式处理监控数据 主动推送 ASP.NET Core 自定义URL .NET diagnostics 自定义监控指标 导读 CZGL.ProcessMetrics 是一个 Metric ...
- .NET周报【10月第3期 2022-10-25】
国内文章 聊一聊被 .NET程序员 遗忘的 COM 组件 https://www.cnblogs.com/huangxincheng/p/16799234.html 将Windows编程中经典的COM ...
- JNI详解---从不懂到理解
转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...
- CLR via C#深解笔记五 - 事件
事件处理实际上是一种具有特殊签名的delegate, 像这个样子:public delegate void EventHandler(object sender, EventArgs e); 类型 ...
随机推荐
- SVG裁剪和平移的顺序
SVG 里为元素添加 clip-path 属性即可做出裁剪效果,添加 transfrom 属性可以平移.旋转元素. 根据需求不同,有两种情况: 先裁剪元素,再把裁剪后的图形平移 先平移元素,再按区域裁 ...
- Node.js高级编程读书笔记 - 2 文件和进程处理
Outline 3 文件.进程.流和网络 3.1 查询和读写文件 3.2 创建和控制外部进程 3.3 读写数据流 3 文件.进程.流和网络 3.1 查询和读写文件 path 从Node 0.8起,pa ...
- jquery dataTables.min.js API
demo: http://datatables.net/release-datatables/examples/api/select_single_row.html 选择一行http://datata ...
- nginx配置文件重写url不带index.php
如题: 代码 location / { root /项目目录/; index index.php; if (-f $request_filename/index.php){ rewrite (.*) ...
- appserv升级php
安装thinkphp的时候提示必须要php5.3及以上 本地测试服务器使用的是appserv集成环境 所以要单独升级php 首先到官网下载http://php.net/downloads.php wi ...
- 递归输出文件夹下的所有文件的名称(转自 MSDN)
问题:如何输出给定文件夹目录下面的所有文件的名称? C#代码: using System; using System.IO; namespace MyTest { public class Progr ...
- 论文笔记之:Co-saliency Detection via A Self-paced Multiple-instance Learning Framework
Co-saliency Detection via A Self-paced Multiple-instance Learning Framework T-PAMI 2016 摘要:Co-sal ...
- 公钥与私钥,HTTPS详解
1.公钥与私钥原理1)鲍勃有两把钥匙,一把是公钥,另一把是私钥2)鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把.3)苏珊要给鲍勃写一封保密的信.她写完后用鲍勃的公钥加密,就可以达到 ...
- javascript获取对象中的属性及值
function displayProp(obj){ var names=""; for(var name in obj){ names+=name+": "+ ...
- C# : Post 接收或发送XML
项目分成两个 web(ASP.Net)用户处理请求,客户端(wpf/winform)发送请求 1.web项目 有两个页面 SendPost.aspx(单纯发送数据给客户端) 代码: public pa ...