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

CLR_Via_C#事件的更多相关文章

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

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

  2. CLR_Via_C#学习笔记之事件

    一:首先我先引用网上别人对事件的一些说明,然后将会通过一个事例进行对事件的演示: EventArgs是包含事件数据的类的基类,用于传递事件的细节.EventHandler是一个委托声明如下 publi ...

  3. CLR_Via_C#学习笔记之枚举

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

  4. Jquery的点击事件,三句代码完成全选事件

    先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  5. 关于 Chrome 浏览器中 onresize 事件的 Bug

    我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...

  6. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  7. C++中的事件分发

    本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...

  8. 移动端IOS点击事件失效解决方案

    解决方案 解决办法有 4 种可供选择: 1 将 click 事件直接绑定到目标元素(即 .target)上 2 将目标元素换成 <a> 或者 button 等可点击的元素 3 将 clic ...

  9. Android笔记——Button点击事件几种写法

    Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...

随机推荐

  1. 将字符串“abc”全排列成:abc、acb、bac、bca、cab、cba

     [STAThread]         static void Main()         {             string s = "abcd";           ...

  2. 基于OCR的SeeTest框架可行性分析总结

    总的来说相比其他几个免费框架,SeeTest功能更全面和易用,但收费有点昂贵:License 3500/年:多平台和多语言(基于OCR)还需要额外购买,分别是500/Year和1750$/.详情请查看 ...

  3. Gimp插件Hello world注释

    前一阵翻译gimp官网的编写插件教程,本打算继续翻译第二部分,但是感觉第一个例子还不是很懂,翻译第二部分有点理解不能,所以就读了一下源码,记录如下 #include <libgimp/gimp. ...

  4. windows 7 telnet 开启关闭

    win7运行telnet提示:'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件 原因:win7默认没有打开此功能 解决方案:控制面板->程序和功能->打开或关闭wind ...

  5. HDU 5185 Equation (DP)

    题目:LINK 题意:求满足题目要求的x序列的种类数. 能够发现符合条件的序列去重后是一个0, 1, ..., k的连续序列(k满足k*(k+1)/2 <= n) ,则这个去重后的序列长度最长为 ...

  6. [译]Java 设计模式之命令

    (文章翻译自Java Design Pattern: Command) 命令设计模式在进行执行和记录的时候需要一个操作及其参数和封装在一个对象里面.在下面的例子中,命令是一个操作,它的参数是一个Com ...

  7. 微软的权限框架Asp.Net Identity

    Asp.Net Identity 深度解析 之 注册登录的扩展   关于权限每个系统都有自己的解决方案,今天我们来讨论一下微软的权限框架Asp.Net Identity ,介绍如下  http://w ...

  8. 高效DevOps的10项实践

    高效DevOps的10项实践 原文链接: http://www.drdobbs.com/architecture-and-design/top-10-practices-for-effective-d ...

  9. Mysql基础之字符集与乱码

    原文:Mysql基础之字符集与乱码 Mysql的字符集设置非常灵活 可以设置服务器默认字符集 数据库默认字符集 表默认字符集 列字符集 如果某一个级别没有指定字符集,则继承上一级. 以表声明utf8为 ...

  10. Hibernate在自由状态和持久的状态转变

    在Hibernate在.一PO术后可能长时间,session过时关闭.此时PO它一直是游离状态的对象,在这种状态下,以被转换成持久战,有几种方法如下: 1.session.saveOrUpdate(o ...