1.事件模型建立在委托的基础上。

2,定义事件编译器会做三个动作,第一个构造具有委托类型的字段,事件发生时会通知这个列表中的委托。

第二个构造的是一个添加关注的方法+=。

   第三个构造是一个注销事件关注的方法-=。

3,一个对象不再希望接收事件通知时应该注销对事件的关注,只要一个对象仍向事件登记了一个方法,这个对象不能垃圾回收,所以你的对象若实现了IDisposable的Dispose方法,应该注销对所有事件的关注。

4,-=,remove一个不存在的委托时,不会报错。

下面是一个定义事件的标准写法:引用http://blog.csdn.net/sun_dragon/article/details/8726681

1,定义一个类型来容纳所有应该发送给事件通知接收者的附加信息

2,定义事件成员

3,定义负责引发事件的方法来通知事件的登记对象

    class PriceChangedEventArgs : EventArgs
{
public readonly decimal LastPrice;
public readonly decimal NewPrice;
public PriceChangedEventArgs(decimal lp, decimal np)
{
LastPrice = lp;
NewPrice = np;
}
}
 /// <summary>
/// 扩展方法,用来封装这个线程的逻辑安全
/// </summary>
public static class EventArgExtensions
{
public static void Raise<TEventArgs>(this TEventArgs e,object sender,ref EventHandler<TEventArgs> eventDelegate)where TEventArgs:EventArgs
{
//Interlocked需要4.5环境
//处于线程安全考虑,现在将委托字段的引用复制到一个临时字段中
EventHandler<TEventArgs> temp = Interlocked.CompareExchange(ref eventDelegate, null, null);
if (temp != null)
temp(sender, e);
}
}
    class Stock//即是广播又是接收
{
decimal price;
//string symbol = "stock";
public event EventHandler<PriceChangedEventArgs> PriceChanged;
public decimal Price
{
get { return price; }
set
{
if (price != value)
{
OnPriceChanged(new PriceChangedEventArgs(price, value));//事件触发
}
price = value;
}
} //简单写法,通常这个就够了
//protected virtual void OnPriceChanged(PriceChangedEventArgs e)
//{
// if (PriceChanged != null)
// PriceChanged(this, e);
//} /// <summary>
/// 线程安全写法,事件主要在单线程中使用,线程安全并不是一个问题,先记下有这个东西
/// 考虑这个线程竞态条件应该意识到一个方法可能在从事件的委托链中移除后得到调用
/// </summary>
/// <param name="e"></param>
protected virtual void OnPriceChanged(PriceChangedEventArgs e)
{
e.Raise(this,ref PriceChanged);
}
}

最后是调用

    class EvenManage
{
static void priceChangeInMain(Object sender, PriceChangedEventArgs e)
{
System.Console.WriteLine(sender.ToString());
System.Console.WriteLine("last price" + e.LastPrice + "\nnew price" + e.NewPrice);
}
public static void text()
{
Stock s = new Stock();
s.Price = 100M;//这时没有调用priceChangeInMain,因为没有添加事件
s.PriceChanged += priceChangeInMain;
s.Price = 200M;//添加完事件之后的触发调用了priceChangeInMain
}
}
 

【CLR in c#】事件的更多相关文章

  1. CLR VIA C#事件

    事件是类型的一个成员,用来在事情发生的时候通知注册了该事件的成员. 事件和观察者模式十分的相似,所以事件应该提供如下几种能力 1.能让对象的方法登记对他的关注 2.能让对象的方法取消对他的关注 3.能 ...

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

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

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

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

  4. NEsper使用的事件类型 z

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

  5. .NET 中的委托

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. IOS - UITableViewCell的选中时的颜色及tableViewCell的selecte与deselecte

    1.系统默认的颜色设置 [cpp] view plaincopy //无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 ...

  2. .NET微信公众号开发-5.0微信支付

    一.前言 在开始做这个功能之前,我们要做的第一件事情就是思考,如何做这个微信支付,从哪里开始,从哪里入手,官方的sdk说明什么的,有没有什么官方的demo,还有就是老板给我的一些资料齐全不,那些要申请 ...

  3. Mysql之复制选项与监控

    1.Slave 筛选选项: --replicate-do-db  ,同步复制哪些库 --replicate-ignore-db,忽略哪些库 --replicate-do-table=db_name.t ...

  4. Hadoop-2.X HA模式下的FSImage和EditsLog合并过程

    补充了一下NameNode启动过程中有关FSImage与EditsLog的相关知识. 一.什么是FSImage和EditsLog 我们知道HDFS是一个分布式文件存储系统,文件分布式存储在多个Data ...

  5. Clr Via C#读书笔记----基元线程同步构造

    线程文章:http://www.cnblogs.com/edisonchou/p/4848131.html 重点在于多个线程同时访问,保持线程的同步. 线程同步的问题: 1,线程同步比较繁琐,而且容易 ...

  6. 攻城狮在路上(叁)Linux(十三)--- 文件与目录的管理

    一.查看文件与目录: 1.命令格式:ls [-aAdfFhilnrRSt] 目录名称; 2.参数说明: -a:显示所有的文件,包括隐藏文件(隐藏文件一般以.开头). -d:仅列出目录本身. -l:列出 ...

  7. nodejs2

    jade@1.11.0 严格注意缩进 extends layout block content h1= title p Welcome to #{title} - var a='abc'; p his ...

  8. C# 使用Trace记录程序日志

    在程序开发中,我们通常需要记录程序运行的状态,在程序部署后,发生的异常可以记录在日志中,便于发现程序潜在的问题.在.NET平台,有很多优秀的日志类库,例如Log4Net.如果程序很小,我们可以自己通过 ...

  9. SQL常用查询语句及函数

    1.日期匹配_获取时间差 select datediff(dd,getdate(),'12/25/2006')  --计算从今天到12/25/2006还有多少个月 2.不能通过IP连接数据库 在数据库 ...

  10. Visual Studio 2015将在7月20号RTM

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:用了3个多月的VS 2015终于要迎来RTM了,不过感觉有点淡淡的忧伤(为什么呢?请看 ...