1.什么是事件,事件和委托什么关系?

事件?事件,就是,比如按一个按钮,弹出你好对话框,就是一个事件。

事件和委托? 事件就是委托的一种呀,委托可以理解为回调机制,回调函数。

2. 怎么理解C#事件,可以用一个例子说明?

C#事件,我们可以举个栗子。

邮件管理者可以接收各种各样的邮件,但邮件管理者不做邮件处理, 比如打印邮件是传真机做的事情。

那么邮件管理者可以接收到邮件后,通知打印机打印该邮件。这个过程就是C#事件处理的过程。

首先我们要清楚几个对象:

(1) 邮件是一个事件动作类型,这个事件上可以是定义什么人发邮件,接收邮件,内容是什么等等。

(2) 邮件管理者,是负责邮件接收的对象,是这个事件的直接关系人,但功能就是接收邮件,不对邮件进行其他处理。

(3) 打印机,打印机负责对 接收邮件后续的操作,他无法接收邮件,只能求邮件管理者告诉他需要的邮件,那么就会产生一个订阅的操作。

3.那么每个对象中需要做的事情是什么?

(1)邮件事件对象 :

a.继承于事件EventArgs,定义该事件的参数。

b. 定义一个邮件事件的委托,负责给邮件管理者用。

(2) 邮件管理者:

a. 定义接收邮件的委托对象,作为触发邮件事件的对象。

b. 有一个触发事件的函数,需要触发该函数,才能接收邮件这个时间。

c. 可以包装一下这个触发事件,满足邮件事件对象的要求。

d. 通知 订阅者(打印机),邮件到了,可以进行打印了。

(3)打印机 事件订阅者

a. 订阅事件,求邮件管理者帮忙通知他一下。

b.  收到通知后,后续处理函数。

4. 理解了以上事件的流程,那么可以粘贴代码了。

4.1 事件对象

/// <summary>
/// 定义事件委托,负责给管理者用
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void MailEventHandler(object sender, MailEventArgs e);

/// <summary>
/// 事件类
/// </summary>
public class MailEventArgs: EventArgs
{
public string From;

public string To;

public string Content;

public MailEventArgs(string from, string to, string content)
{
this.From = from;
this.To = to;
this.Content = content;
}
}

4.2 事件管理者(邮件管理)

/// <summary>
/// 事件管理者,(邮件管理)
/// </summary>
public class MailManager
{
/// <summary>
/// 定义接收邮件事件
/// </summary>
public event MailEventHandler MailHandler;

/// <summary>
/// 触发事件函数
/// </summary>
/// <param name="e"></param>
public void OnMail(MailEventArgs e)
{
var handler = this.MailHandler;
if(handler != null)
{
handler(this, e);
}
}

/// <summary>
/// 包装一下触发函数
/// </summary>
public void ReceiveMail(string from ,string to, string content)
{
MailEventArgs e = new MailEventArgs(from, to, content);
OnMail(e);
}
}

4.3 事件的订阅者,打印处理

/// <summary>
/// 事件订阅者,传真打印
/// </summary>
public class Fax
{
/// <summary>
/// 事件订阅,管理者通知订阅者进行下一步操作。(传真打印)
/// </summary>
/// <param name="mm"></param>
public Fax(MailManager mm)
{
mm.MailHandler += FaxMsg;
}

/// <summary>
/// 订阅者处理事情
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void FaxMsg(object sender, MailEventArgs e)
{
Console.WriteLine("打印{0},{1},{2}", e.To, e.From, e.Content);
}
}

4.4 什么时候接收到邮件,通知打印机

static void Main(string[] args)
{
MailManager mm = new MailManager();
mm.ReceiveMail("Bill", "Mike", "nihao");

Fax fax = new Fax(mm);

}

搞定。

C# 事件 解析的更多相关文章

  1. jquery关于移动端的点击事件解析

    jquery关于移动端的点击事件解析 如果用click来写 你连续点几下 会没有反应 响应是非常慢的 所以移动端必须用touchstart代替click来写

  2. 【ABAP系列】SAP ABAP选择屏幕(SELECTION SCREEN)事件解析

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP选择屏幕(SEL ...

  3. Spring事件解析

    首先介绍Spring事件相关类的关系: 其中EventListener与EventObject均是Java SE的范畴,源码如下: package java.util; public interfac ...

  4. Jquery 鼠标事件解析

    1 mouseover与mousemove的区别: mouseover是当鼠标移动到对象时产生,只产生一次,这时如果继续在对象上移动,不会再产生mouseover事件,而是mousemove事件,mo ...

  5. javascript中的cookie,以及事件解析

    Cookie: 它的意思是在本地的客户端的磁盘上以很小的文件形式保存数据,Cookie的处理原则上需要在服务器环境下运行,目前Chrome不可以在客户端操作Cookie,其他浏览器均可以,   Coo ...

  6. SharePoint 2010中列表Add和Delete事件解析

    转:http://winsystem.ctocio.com.cn/26/11400026_2.shtml [IT专家网独家撰稿]SharePoint 2010与以前的版本相比,天翻地覆的变化并不为过. ...

  7. C#事件解析

    事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于window ...

  8. javascript event 事件解析

    event对象只在事件发生的过程中才有效. event的某些属性只对特定的事件有意义.比如,fromElement 和 toElement 属性只对 onmouseover 和 onmouseout ...

  9. C#事件の事件解析

    事件(event)是基于windows消息处理机制的类,封装的更好,让开发者无须知道底层的消息处理机制,就可以开发出强大的基于事件的应用程序来.委托(delegate)委托可以理解成为函数指针,不同的 ...

随机推荐

  1. Spring Cloud 升级最新 Finchley 版本,踩了所有的坑!

    Spring Boot 2.x 已经发布了很久,现在 Spring Cloud 也发布了 基于 Spring Boot 2.x 的 Finchley 版本,现在一起为项目做一次整体框架升级. 升级前 ...

  2. Flutter采坑之路 用真机跑起来的时候提示 initGradle失败,IO异常,downloading Gradle-4.6-all.zip失败

    这个异常就是Gradle下载异常,进而下面会提示一行IO异常 我这里的原因就是Gradle对应的4.6-all版本下载不下来(一般情况下确实很难下载下来) 所以在正常AS工程呢,我们选择一下Gradl ...

  3. Python+turtle交互式绘图:可以用鼠标拖动的小海龟

    下面是我画海龟的过程: (1)打开python: 2.调用turtle库,先设置一些基础设置,与一个画龟的函数 from turtle import Screen,Turtle,mainloop cl ...

  4. pytorch使用总结

    loss的获取 在看别人代码的时候发现都是 loss=net.loss train_loss+=loss.data[0]#train_loss用于累加梯度 在想为什么不直接使用loss呢,因为pyto ...

  5. Weblogic WLS-WebServices组件反序列化漏洞复现

    漏洞分析: 当weblogic使用WLS-WebServices组件时,该组件会调用XMLDecoder解析XML数据,由此就产生了该漏洞 影响版本: weblogic<10.3.6版本 复现过 ...

  6. js 批量提交数据

    // 批量提交数据 let pageSize = 100, total = dataTmp.length, list = dataTmp let totalPage = Math.ceil(total ...

  7. Public_1.bat

    :: targetset targetFileName=Public_2set targetPath=./:: sourceset sourceFileName=Public_1@echo ui ru ...

  8. 开发部署项目时出现:java.lang.OutOfMemoryError: PermGen space

    java.lang.OutOfMemoryError: PermGen space 错误: 原文地址:http://www.cnblogs.com/shihujiang/archive/2012/06 ...

  9. 关于warning: suggest parentheses around assignment used as truth value [-Wparentheses]|的解决方法

    今天,在调试的时候一直出现warning: suggest parentheses around assignment used as truth value 代码如下: if(startTime== ...

  10. Kali Linux Vmware虚拟机(新手)安装

    准备工作: 1.安装VMware workstation 软件 2.下载好kali linux 的ios系统文件 3.打开电脑的虚拟化支持(Intel VT-x/EPT或AMD-V/RVI(V)) 虚 ...