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. centos 6.5 配置LDAP服务器+客户端!

    各种度娘!各种歌哥!网上教程参差不齐,历时1天,终于完成,不敢独享,遂,总结分享之,有问题可以留言,知无不言...开始吧 Note: 本次配置的服务器环境是<redhat enterprise ...

  2. css 自动换行 [英文、数字、中文]

    white-space:normal;overflow: auto;table-layout:fixed; word-break: break-all;

  3. Linux vmstat字段解析

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.这个命令是我查看Linux/Unix最 ...

  4. eclipse maven tomcat7 热部署

    .配置tomcat a.配置jdk b.CATALINA_HOME=c:\tomcat CATALINA_BASE=c:\tomcat .tomcat配置密码 C:\Program Files\oth ...

  5. Jmeter中通过BeanShell获取当前时间

    第一步编写需要的java类: 第二步:将编写好的java类打包成jar包 第三步:将jar包放到\apache-jmeter-2.13\lib\ext下面 第四步:在Jmeter中通过BeanShel ...

  6. jq点击和鼠标移上效果以及一个等号"=" 二个等号"==" 三个等号"===" 的区别

    <body> <div class="a" bs='1' style="width:100px; height:30px; border:1px sol ...

  7. php 上传文件实例 注册账号

    注册界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  8. Java系列笔记(3) - Java 内存区域和GC机制

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

  9. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  10. eclipse中的任务标记(TODO、FIXME、XXX)

    eclipse Task Tags: TODO -用来提醒该标识处的代码有待返回继续编写.更新或者添加.该标签通常在注释块的源文件顶部. FIXME -该标签用来提醒你代码中存在稍后某个时间需要修改的 ...