namespace Vczx.ProCSharp.Event
{
/// <summary>
/// 类EatEventArgs 必须继承自类EventArgs,用来引发事件时封装数据
/// </summary>
public class EatEventArgs : EventArgs
{
public String 饭店名称; //饭店名称
public decimal 准备消费金额; //准备消费金额
} /// <summary>
/// 这个委托用来说明处理吃饭事件的方法的方法头(模式)
/// </summary>
public delegate void EatEventHandler(object sender, EatEventArgs e); /// <summary>
/// 引发吃饭事件(EateEvent)的类Master(主人),这个类必须
/// 1.声明一个名为EatEvent的事件: public event EatEventHandler EatEvent;
/// 2.通过一个名为OnEatEvent的方法来引发吃饭事件,给那些处理此事件的方法传数据;
/// 3.说明在某种情形下引发事件呢?在饿的时候。用方法Hungrg来模拟。
/// </summary>
public class 主人
{
//声明事件
public event EatEventHandler EatEvent; //引发事件的方法
public void OnEatEvent(EatEventArgs e)
{
if (EatEvent != null)
{
EatEvent(this, e);
}
} //当主人饿的时候,他会指定吃饭地点和消费金额。
public void 主人饿(String restrauntName, decimal moneyOut)
{
EatEventArgs e = new EatEventArgs();
e.饭店名称 = restrauntName;
e.准备消费金额 = moneyOut; Console.WriteLine("主人说:");
Console.WriteLine("我饿了,要去{0}吃饭,消费{1}元", e.饭店名称, e.准备消费金额); //引发事件
OnEatEvent(e);
}
} /// <summary>
/// 类Servant(仆人)有一个方法ArrangeFood(安排食物)来处理主人的吃饭事件
/// </summary>
public class 仆人
{
public void 安排食物(object sender, EatEventArgs e)
{
Console.WriteLine();
Console.WriteLine("仆人说:");
Console.WriteLine("我的主人, 您的命令是 : ");
Console.WriteLine("吃饭地点 -- {0}", e.饭店名称);
Console.WriteLine("准备消费 -- {0}元 ", e.准备消费金额);
Console.WriteLine("好的,正给您安排。。。。。。。。\n");
System.Threading.Thread.Sleep(5000);
Console.WriteLine("主人,您的食物在这儿,请慢用");
Console.Read();
}
} /// <summary>
/// 类God安排qinshihuang(秦始皇)的仆人是lisi(李斯),并让李斯的ArrangeFood
/// 方法来处理qinshihuang的吃饭事件:qinshihuang.EatEvent += new EatEventHandler(lishi.ArrangeFood);
/// </summary>
public class God
{
public static void Start()
{
主人 qinshihuang = new 主人();
仆人 lishi = new 仆人(); qinshihuang.EatEvent += new EatEventHandler(lishi.安排食物); //秦始皇饿了,想去希尔顿大酒店,消费5000元
qinshihuang.主人饿("希尔顿大酒店", 5000.0m);
}
}
} //输出: //主人说:
//我饿了,要去希尔顿大酒店吃饭,消费5000.0元 //仆人说:
//我的主人, 您的命令是 :
//吃饭地点 -- 希尔顿大酒店
//准备消费 -- 5000.0元
//好的,正给您安排。。。。。。。。 //主人,您的食物在这儿,请慢用

  

这有一个很好的例子,有助于理解事件机制。

using  System;

namespace  Vczx.ProCSharp.Event  
{  
/// <summary>  
/// 类EatEventArgs 必须继承自类EventArgs,用来引发事件时封装数据  
/// </summary>  
public  class  EatEventArgs  :  EventArgs  
{  
public String restrauntName;     //饭店名称  
public decimal moneyOut;     //准备消费金额  
}

/// <summary>  
/// 这个委托用来说明处理吃饭事件的方法的方法头(模式)  
/// </summary>  
public delegate void EatEventHandler(object sender, EatEventArgs e);

/// <summary>  
/// 引发吃饭事件(EateEvent)的类Master(主人),这个类必须  
/// 1.声明一个名为EatEvent的事件: public event EatEventHandler EatEvent;  
/// 2.通过一个名为OnEatEvent的方法来引发吃饭事件,给那些处理此事件的方法传数据;  
/// 3.说明在某种情形下引发事件呢?在饿的时候。用方法Hungrg来模拟。  
/// </summary>  
public class Master  
{  
//声明事件  
public event EatEventHandler EatEvent;

//引发事件的方法  
public void OnEatEvent(EatEventArgs e)  
{  
if (EatEvent != null)  
{  
EatEvent(this, e);  
}  
}

//当主人饿的时候,他会指定吃饭地点和消费金额。  
public void Hungry(String   restrauntName, decimal moneyOut)  
{  
EatEventArgs e = new EatEventArgs();  
e.restrauntName = restrauntName;  
e.moneyOut = moneyOut;

Console.WriteLine("主人说:");  
Console.WriteLine("我饿了,要去{0}吃饭,消费{1}元", e.restrauntName, e.moneyOut);

//引发事件  
OnEatEvent(e);  
}  
}

/// <summary>  
/// 类Servant(仆人)有一个方法ArrangeFood(安排食物)来处理主人的吃饭事件  
/// </summary>  
public class Servant  
{  
public void ArrangeFood(object sender, EatEventArgs e)  
{  
Console.WriteLine();  
Console.WriteLine("仆人说:");  
Console.WriteLine("我的主人, 您的命令是 : ");  
Console.WriteLine("吃饭地点 -- {0}", e.restrauntName);  
Console.WriteLine("准备消费 -- {0}元 ", e.moneyOut);  
Console.WriteLine("好的,正给您安排。。。。。。。。\n");
System.Threading.Thread.Sleep( 5000 );
Console.WriteLine("主人,您的食物在这儿,请慢用"); 
Console.Read();
}  
}

/// <summary>  
/// 类God安排qinshihuang(秦始皇)的仆人是lisi(李斯),并让李斯的ArrangeFood  
/// 方法来处理qinshihuang的吃饭事件:qinshihuang.EatEvent += new EatEventHandler(lishi.ArrangeFood);  
/// </summary>  
public class God  
{  
public static void Start()  
{  
Master   qinshihuang = new Master();  
Servant lishi = new Servant();

qinshihuang.EatEvent += new EatEventHandler(lishi.ArrangeFood);

//秦始皇饿了,想去希尔顿大酒店,消费5000元  
qinshihuang.Hungry("希尔顿大酒店", 5000.0m);  
}  
}  
}

输出:

主人说:
我饿了,要去希尔顿大酒店吃饭,消费5000.0元

仆人说:
我的主人, 您的命令是 :
吃饭地点 -- 希尔顿大酒店
准备消费 -- 5000.0元
好的,正给您安排。。。。。。。。

主人,您的食物在这儿,请慢用

C#事件(event)解析委托的更多相关文章

  1. C#事件(event)解析

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

  2. 深入理解事件(event)与委托(delegate)

    好久没学.NET了,最近重又开始学习,发现委托有很多变化了,发现事件不明白了(可能以前就没明白过) 网上搜索了几篇文章,也没注意什么时候的,发现都讲的不彻底,综合一下,也当个学习笔记. using S ...

  3. C# 事件 event 【转】

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

  4. 重温委托(delegate)和事件(event)

    1.delegate是什么 某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作 ...

  5. 关于C# 委托(delegate)与事件(event)的用法及事例

    C#中的委托和事件对于新手可能会有一点难理解,所以先从一个小例子入手,以便能更好的理解其如何使用.有一个学生每天定闹钟在早上6点起床,所以当每天早上6点的时候,闹钟就会响起来,从而学生才会按时起床. ...

  6. laravel框架中Job和事件event的解析

    本篇文章给大家带来的内容是关于laravel框架中Job和事件event的解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在做项目的时候,一直对Job和Event有个疑惑.感觉两 ...

  7. C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较

    使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新 使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和 ...

  8. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  9. XAML实例教程系列 - 事件(Event) 五

    Kevin Fan分享开发经验,记录开发点滴 XAML实例教程系列 - 事件(Event) 2012-06-19 01:36 by jv9, 1727 阅读, 7 评论, 收藏, 编辑 Events, ...

随机推荐

  1. 【leetcode 138. 复制带随机指针的链表】解题报告

    方法一:递归 unordered_map<Node*,Node*> dict; Node* copyRandomList(Node* head) { if (!head) return h ...

  2. NSRange 范围

    前言 结构体,这个结构体用来表示事物的一个范围,通常是字符串里的字符范围或者集合里的元素范围. typedef struct _NSRange { NSUInteger location; // 表示 ...

  3. postgresql删除活动链接的数据库

    当我们在使用drop database testdb命令删除数据库时,会提示该数据库正在被使用,这样我们就无法删除,此时我们可以通过如下语句断开该数据库的所有链接: SELECT pg_termina ...

  4. 【转】asp.net中设置弹出谈话框的几种方式详解

    源地址:https://blog.csdn.net/zou15093087438/article/details/79637114 注:可用winform的MessageBox的方法,只需引用Syst ...

  5. Django权限控制进阶

    一.一级菜单的排序 我们用字典存放菜单信息,而字典是无序的,当一级菜单过多时可能会出现乱序情况,因此需要给一级菜单排序 1.给一级菜单表的model中加一个weight权重的字段 ,权重越大越靠前 w ...

  6. Python操作hdfs

    Python直接操作hdfs,包括追加数据文件到hdfs文件 #!coding:utf-8 import sys from hdfs.client import Client #设置utf-8模式 r ...

  7. JavaWeb学习笔记(十一)—— JavaWeb开发模式【转】

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...

  8. 【算法笔记】B1036 跟奥巴马一起编程

    1036 跟奥巴马一起编程 (15 分) 美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴 ...

  9. 补档 VS远程调试

    先说概念 开发机:将编译好的程序部署到目标机器上执行.配置 VS 工程,建立与目标机的连接,开始远程调试. 目标机:负责执行目标程序.安装和运行远程工具 (Remote Debugger),等待来自开 ...

  10. Advanced Data Structures in competitive programming

    1.bit #define isOn(S, j) (S & (1 << j)) #define setBit(S, j) (S |= (1 << j)) #define ...