一:首先我先引用网上别人对事件的一些说明,然后将会通过一个事例进行对事件的演示;

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#学习笔记之事件的更多相关文章

  1. CLR_Via_C#学习笔记之枚举

    CLR_Via_C#学习笔记之枚举 枚举类型(Enum)定义的一组"符号名称/值"配对:因为枚举类型使用程序更容易编写.阅读和维护,而且它是强类型: 枚举是值类型:由System. ...

  2. 学习笔记---Javascript事件Event、IE浏览器下的拖拽效果

    学习笔记---Javascript事件Event.IE浏览器下的拖拽效果     1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcE ...

  3. Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>

    Caliburn.Micro学习笔记目录 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现 ...

  4. iOS学习笔记--触摸事件

    最近空闲时间在学习iOS相关知识,几周没有更新文章了,今天总结下这些天的学习内容,也整理下iOS的学习笔记,以便以后查阅翻看- iOS中的事件可以分为3大类型: 触摸事件 加速计事件 远程控制事件 响 ...

  5. [JS学习笔记]Javascript事件阶段:捕获、目标、冒泡

    当你在浏览器上点击一个按钮时,点击的事件不仅仅发生在按钮上,同时点击的还有这个按钮的容器元素,甚至也点击了整个页面. 事件流 事件流描述了从页面接收事件的顺序,但在浏览器发展到第四代时,浏览器开发团队 ...

  6. vue学习笔记(四)事件处理器

    前言 在上一章vue学习笔记(三)class和style绑定的内容中,我们学习了如何在vue中绑定class和style,介绍了常用的绑定方法,class的数组绑定和对象绑定以及style的数组绑定和 ...

  7. JavaScript高级程序设计学习笔记之事件

    1.事件流 事件流描述的是从页面中接收事件的顺序. 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播 ...

  8. 4月12日学习笔记——jQuery事件

    下面是在 jQuery 中最常使用的 bind()方法举例:$("#testDiv4").bind("click", showMsg); 我们为 id 是 te ...

  9. c#基础学习笔记-----------委托事件

    这里有一个比较简单的委托实例应用(跨窗体操作控件) http://blog.csdn.net/bdstjk/article/details/7004035 还有一个比较详细的介绍并深入理解委托事件的讲 ...

随机推荐

  1. 二进制求和(LintCode)

    二进制求和 给定两个二进制字符串,返回他们的和(用二进制表示). 样例 a = 11 b = 1 返回 100 细节出了好多问题,提交了好多次... public class Solution { / ...

  2. VMware Workstation的三种网络连接方式

    桥接模式(Bridged).NAT模式(地址转换模式).仅主机模式(Host-Only) 桥接模式就是将主机网卡与虚拟机的网卡利用虚拟网桥进行通信.在桥接的作用下,类似于把物理主机虚拟为一个交换机,所 ...

  3. Xamarin Android项目真机测试闪退

    Xamarin Android项目真机测试闪退 项目在模拟器中运行正常,但在真机上闪退.这是由于项目设置使用共享的Mono运行时.Visual Studio中,在项目属性-Android Option ...

  4. Spring事务传播性

    事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题.事务最重要的两个特性,是事务的传播级别和数据隔离级别.传播级别定义的是事务的控制范围,事务隔离级别定 ...

  5. 【BZOJ 1901】【ZJU 2112】Dynamic Rankings

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 重新用整体二分写了一下. 整体二分的思想详见论文. 貌似带修区间k大和静态区间k大都是\(O( ...

  6. 【递推】【组合数】【容斥原理】UVA - 11806 - Cheerleaders

    http://www.cnblogs.com/khbcsu/p/4245943.html 本题如果直接枚举的话难度很大并且会无从下手.那么我们是否可以采取逆向思考的方法来解决问题呢?我们可以用总的情况 ...

  7. 【manacher】HDU3068-最长回文

    [题目大意] 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. [manacher知识点] ①mx - i > P[j] 的时候,以S[j]为中心的回文子串 ...

  8. 小Z的城市之旅

    题目大意: 从(0,0)走到(x,y),每次可以向上下左右走一格,问走r步刚好到(x,y)的方案数. 思路: 找规律发现答案就是C((r+x-y)/2,r)*C((r-x-y)/2,r). #incl ...

  9. POJ 2079 Triangle(凸包+旋转卡壳,求最大三角形面积)

    Triangle Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 7625   Accepted: 2234 Descript ...

  10. Unity3D 避免玩家作弊

    如果你的Unity项目快上线了,我强烈建议你看一下Anti-Cheat这个插件.因为IOS和Android分别越狱和Root后玩家可以使用 @八门神器 @烧饼修改器 等一些列作弊的软件来修改游戏内存, ...