CLR_Via_C#学习笔记之事件
一:首先我先引用网上别人对事件的一些说明,然后将会通过一个事例进行对事件的演示;
EventArgs是包含事件数据的类的基类,用于传递事件的细节。EventHandler是一个委托声明如下
public delegate void EventHandler( object sender , EventArgs e ) 注意这里的参数,前者是一个对象(其实这里传递的是对象的引用,
如果是button1的click事件则sender就是button1),后面是包含事件数据的类的基类。private void button1_Click(object sender, System.EventArgs e){}
这是我们和button1_click事件所对应的方法。注意方法的参数符合委托中的签名(既参数列表)。那我们怎么把这个方法和事件联系起来呢,请看下面的代码。
this.button1.Click += new System.EventHandler(this.button1_Click);把this.button1_Click方法绑定到this.button1.Click事件。
下面我们研究一下C#事件处理的工作流程,首先系统会在为我们创建一个在后台监听事件的对象(如果是 button1的事件那么监听事件的就是button1),这个对象
用来产生事件,如果有某个用户事件发生则产生对应的应用程序事件,然后执行订阅了事件 的所有方法。
二:事件实例

NewMailEventArgs.cs为事件类:它必须继承自EventArgs;此处我们定义的三个属性,方便后面的传参
namespace EventDemo
{
internal class NewMailEventArgs:EventArgs
{
private readonly string m_From, m_To, m_Subject; public string From { get { return m_From; } }
public string To { get { return m_To; } }
public string Subject { get { return m_Subject; } } public NewMailEventArgs(string From, string To, string Subject)
{
this.m_From = From;
this.m_To = To;
this.m_Subject = Subject;
}
}
}
类MailManager.cs里定义的对事件调用;此处我们定义的一个委托;
namespace EventDemo
{
internal class MailManager
{
public delegate void NewMailEventHandler(object sender,NewMailEventArgs e); public event NewMailEventHandler NewMailEvent; protected virtual void OnNewMailEvent(NewMailEventArgs e)
{
if(NewMailEvent!=null)NewMailEvent(this,e);
} public void RaiseEvent(string From,string To,string Subject)
{
NewMailEventArgs e=new NewMailEventArgs(From,To,Subject);
OnNewMailEvent(e);
}
}
}
类MailListener.cs是事件的监听;包括对事件的订阅以及对取消订阅
namespace EventDemo
{
internal class MailListener
{
public void KeyPressed(object sender, NewMailEventArgs e)
{
Console.WriteLine("发送者:{0},所按得健为:{1}", sender, e.From + "|" + e.To + "|" + e.Subject);
} public void Subscribe(MailManager evenManager)
{
evenManager.NewMailEvent += new MailManager.NewMailEventHandler(KeyPressed);
} public void UnSubScribe(MailManager evenManager)
{
evenManager.NewMailEvent -= new MailManager.NewMailEventHandler(KeyPressed);
}
}
}
接下来是测试调用代码:此得我们以一个控制台的程序进行
namespace EventDemo
{
class Program
{
static void Main(string[] args)
{
MailManager mm = new MailManager();
MailListener ml = new MailListener(); Console.WriteLine("订阅事件\n");
ml.Subscribe(mm); Console.WriteLine("输入一个发送地址,再按enter");
string From = Console.ReadLine();
Console.WriteLine("输入一个收件地址,再按enter");
string To = Console.ReadLine();
Console.WriteLine("输入一个信息内容,再按enter");
string Subject = Console.ReadLine();
mm.RaiseEvent(From, To, Subject); Console.WriteLine("\n取消订阅事件\n");
ml.UnSubScribe(mm); Console.WriteLine("输入一个发送地址,再按enter");
string SubFrom = Console.ReadLine();
Console.WriteLine("输入一个收件地址,再按enter");
string SubTo = Console.ReadLine();
Console.WriteLine("输入一个信息内容,再按enter");
string SubSubject = Console.ReadLine();
mm.RaiseEvent(SubFrom, SubTo, SubSubject);
}
}
}
运行结果如下:

此代码只是本人学习事件的一个小实例,若有不足或错误欢迎指正,[源代码下载]
CLR_Via_C#学习笔记之事件的更多相关文章
- CLR_Via_C#学习笔记之枚举
CLR_Via_C#学习笔记之枚举 枚举类型(Enum)定义的一组"符号名称/值"配对:因为枚举类型使用程序更容易编写.阅读和维护,而且它是强类型: 枚举是值类型:由System. ...
- 学习笔记---Javascript事件Event、IE浏览器下的拖拽效果
学习笔记---Javascript事件Event.IE浏览器下的拖拽效果 1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcE ...
- Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>
Caliburn.Micro学习笔记目录 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现 ...
- iOS学习笔记--触摸事件
最近空闲时间在学习iOS相关知识,几周没有更新文章了,今天总结下这些天的学习内容,也整理下iOS的学习笔记,以便以后查阅翻看- iOS中的事件可以分为3大类型: 触摸事件 加速计事件 远程控制事件 响 ...
- [JS学习笔记]Javascript事件阶段:捕获、目标、冒泡
当你在浏览器上点击一个按钮时,点击的事件不仅仅发生在按钮上,同时点击的还有这个按钮的容器元素,甚至也点击了整个页面. 事件流 事件流描述了从页面接收事件的顺序,但在浏览器发展到第四代时,浏览器开发团队 ...
- vue学习笔记(四)事件处理器
前言 在上一章vue学习笔记(三)class和style绑定的内容中,我们学习了如何在vue中绑定class和style,介绍了常用的绑定方法,class的数组绑定和对象绑定以及style的数组绑定和 ...
- JavaScript高级程序设计学习笔记之事件
1.事件流 事件流描述的是从页面中接收事件的顺序. 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播 ...
- 4月12日学习笔记——jQuery事件
下面是在 jQuery 中最常使用的 bind()方法举例:$("#testDiv4").bind("click", showMsg); 我们为 id 是 te ...
- c#基础学习笔记-----------委托事件
这里有一个比较简单的委托实例应用(跨窗体操作控件) http://blog.csdn.net/bdstjk/article/details/7004035 还有一个比较详细的介绍并深入理解委托事件的讲 ...
随机推荐
- springMVC中Unknown return value type: java.lang.Integer(解决)
controller层返回值类型为Integer,然而报 Unknown return value type: java.lang.Integer 这个错误,500错误 解决办法:在此方法上写上注解@ ...
- 洛谷——P1346 电车
P1346 电车 题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口 ...
- 【SPOJ 220】Relevant Phrases of Annihilation
http://www.spoj.com/problems/PHRASES/ 求出后缀数组然后二分. 因为有多组数据,所以倍增求后缀数组时要特判是否越界. 二分答案时的判断要注意优化! 时间复杂度\(O ...
- luogu P1396 营救
题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门…… 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小 ...
- JZYZOJ1349 SPOJ839 星屑幻想 xor 网络流 最大流
http://172.20.6.3/Problem_Show.asp?id=1349 调了两个小时发现数组开小了[doge].题意:给出几个点,有的点的权值确定,连接两点的边的权值为两点值的异或和,求 ...
- BZOJ 2157 旅游(动态树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2157 [题目大意] 支持修改边,链上查询最大值最小值总和,以及链上求相反数 [题解] ...
- [bzoj1014](JSOI2008)火星人 prefix (Splay维护哈希)
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀. 比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 ...
- 使用SQL_TRACE进行数据库诊断
SQL_TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具.在日常的数据库问题诊断和解决中,SQL_TRACE是非常常用的方法.本文就SQL_TRACE的使用作简单探讨,并 ...
- 配置安全证书的Etcd集群
不知在哪篇技术文档中看到,kubernetes master和etcd分开部署模式,因为集群的状态都保存在etcd中,这样当kubernetes master挂掉后,通过API Server交互的Sc ...
- mac下源码安装redis
转载:http://www.jianshu.com/p/6b5eca8d908b 下载安装包 redis-3.0.7.tar.gz 官网地址:http://redis.io/download 解压:t ...