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. c++多线程基础4(条件变量)

    条件变量是允许多个线程相互交流的同步原语.它允许一定量的线程等待(可以定时)另一线程的提醒,然后再继续.条件变量始终关联到一个互斥 定义于头文件 <condition_variable> ...

  2. spark_flume_mysql 整合

    本人的开发环境: 1.虚拟机centos 6.5 2.jdk 1.8 3.spark2.2.0 4.scala 2.11.8 5.maven 3.5.2     在开发和搭环境时必须注意版本兼容的问题 ...

  3. gym 102082B dp

    和51nod1055 一样: #include<iostream> #include<cstdio> #include<algorithm> #include< ...

  4. [WebShow系列] 固定展示界面的现场调用

    正在制作......,敬请期待. 固定展示界面的现场调用 现场管理员通过现场控制台可以控制主展示界面,实现 主题 所选选手展示 所选选手打分展示 排行展示 详情排行展示 柱状图展示 界面的展示切换外, ...

  5. Markdown 语法快速入门手册

    Markdown 是一种轻量级标记语言,能将文本换成有效的XHTML(或者HTML)文档,它的目标是实现易读易写,成为一种适用于网络的书写语言. Markdown 语法简洁明了,易于掌握,所以用它来写 ...

  6. 二 ASP.NET MVC 第一个程序 hello world

    二 ASP.NET MVC 第一个程序 hello world   https://blog.csdn.net/xmroom/article/details/51335917 我使用的Visual s ...

  7. python 连接数据库 pymysql模块的使用

    一 Python3连接MySQL 本文介绍Python3连接MySQL的第三方库--PyMySQL的基本使用. 1 PyMySQL介绍 PyMySQL 是在 Python3.x 版本中用于连接 MyS ...

  8. vue-persist 为 vuex 持久化!!

    npm install --save vuex-persist import VuexPersistence from 'vuex-persist' const vuexLocal = new Vue ...

  9. Little Elephant and Magic Square

    Little Elephant loves magic squares very much. A magic square is a 3 × 3 table, each cell contains s ...

  10. C++_代码重用4-多重继承

    继承使用时要注意,默认是私有派生.所以要公有派生时必须记得加关键字Public. MI(Multi Inheritance)会带来哪些问题?以及如何解决它们? 两个主要问题: 从两个不同的基类继承同名 ...