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. ajax的get,post ,封装

    let ajax = new Object(); ajax.get = function(url,fn){ //创建ajax对象 let xhr = new XMLHttpRequest(); //与 ...

  2. 【python】Python任务调度模块 – APScheduler

    APScheduler是一个Python定时任务框架,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.并以daemon方式运行应用.目前最新版本为3.0 ...

  3. Django template的html明明改了,前端页面居然没有对应变化?!---Django的小坑

    写django的时候,我有个模板的名字叫detail.html,被detail视图函数渲染 因为那个detail写乱了,但是里面有东西要参考,我没删掉它,改名为detail_old.html,又在目录 ...

  4. SDUT OJ 多项式求和

    多项式求和 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Description 多项式描述 ...

  5. 使用过多的递归出现错误,“System.StackOverflowException”类型的未经处理的异常在 mscorlib.dll 中发生

    class Program { static void Main(string[] args) { sub(0); }     private static void sub(int count) { ...

  6. StyleSheet

    StyleSheet.create()方法 //定义组件 var App = React.createClass({ render:function () { return( <View sty ...

  7. spring boot 自定义静态资源 位置..

    upload-path: E:/upload # 上传文件夹. upload-key: 72b3158c-a0f3-11e8-98d0-529269fb1459 # 定义上传的 key . sprin ...

  8. Mutation and Iteration

    avoid mutating a list as you are iterating over it 代码: def remove_dups(L1,L2): for e in L1: if e in ...

  9. HDU6395(分段+矩阵快速幂)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6395 给你一个式子,给出你A,B,C,D,P,n,让你求出第n项的式子Fn.(其中ABCDPn均在1e9的 ...

  10. UVA - 11584 DP 最少线段覆盖

    题意:用最少的不可交线段覆盖整个区间,求该最小值 课上摸鱼的时候没注意到题意的转换,写了没啥卵用的回文中心最长枚举,所以代码里的st和h/h2是几乎没用的 注意状态转移的时候不要只用最长线段去转移,这 ...