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); 类型 ...
随机推荐
- xmind的第七天笔记
- sql语句与数据库2
增加数据 insert into wyx(xh,nl,xb,sfzh,zcrq)values(0422,28,男,210623198711111111,2016-8-19); 删除数据 delete ...
- ATMEL处理器自带USB CDC的Win7驱动问题
[背景] 很久以前使用ATMEL的处理器开发了一款设备,通过处理器本身的功能,借助USB在PC端虚拟一个串口出来,实现和上位机软件的通信,和基本的参数设置和数据读取功能. 这个功能就是ATMEL官网上 ...
- MongoDB学习笔记一:入门
文档:多个键及其关联的值『有序』地放置在一起. {"greeting" : "Hello, world!", "foo" : 3}集合:一组 ...
- AsyncTask 轻量级的异步类
初步:http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html 详细:http://blog.csdn.net/liuhe68 ...
- 请求rest web服务client
RestClient using System; using System.Globalization; using System.IO; using System.Net; using System ...
- PC安装了MAC,那么CMD键和OPTION键什么的在哪里?
OS X中Command键所在的位置对应windows中Alt键的位置,OS X中Option键对应windows中Shift键的位置.如果使用中有不习惯的地方,可以通过设置修改,具体方法如下: 1. ...
- Oracle和sqlserver关于锁和隔离级别的差异
事务属性:ACID(原子性.一致性.隔离性.持久性) 隔离级别:主要针对的是共享锁的持有时间和范围 SQL标准定义了以下四种事务隔离级别 READ UNCOMMITTED 允许脏读. 不可重 ...
- [转]Windows系统中监控文件复制操作的几种方式
1. ICopyHook 作用: 监视文件夹和打印机移动,删除, 重命名, 复制操作. 可以得到源和目标文件名. 可以控制拒绝操作. 缺点: 不能对文件进行控制. 只对Shell文件操作有效, 对原生 ...
- Lab_1_SysOps_Compute_Linux_v2.5
System Operations - Lab 1: Creating Elastic Compute Cloud (Amazon EC2) Instances (Linux) - 2.5 ===== ...