[整理]近段了解一些委托事件的工作原理.找到两个很不错的例子,所以特拿出与大家分享!
2005-06-16 18:43
736 查看
第一个例子
http://www.akadia.com/services/dotnet_delegates_and_events.html
思归给的委托事件参考站点
public delegate void EatEventHandler(object sender, EatEventArgs e);
这个的定义也可以不要这样.可以直接就定义一个参数
public delegate void EatEventHandler(string e); 但然用的时候的参数要相对应好哦
using System;
namespace nsEventSample
{
/// <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("好的,正给您安排。。。。。。。。");
Console.WriteLine("主人,您的食物在这儿,请慢用");
}
}
/// <summary>
/// 类God安排qinshihuang(秦始皇)的仆人是lisi(李斯),并让李斯的ArrangeFood
/// 方法来处理qinshihuang的吃饭事件:qinshihuang.EatEvent += new EatEventHandler(lishi.ArrangeFood);
/// </summary>
public class God
{
public static void Main()
{
Master qinshihuang = new Master();
Servant lishi = new Servant();
qinshihuang.EatEvent += new EatEventHandler(lishi.ArrangeFood);
//秦始皇饿了,想去希尔顿大酒店,消费5000元
qinshihuang.Hungry("希尔顿大酒店", 5000.0m);
}
}
}
底二个例子
http://community.csdn.net/Expert/topic/2651/2651579.xml?temp=.7183191
比如说一个公司(场景),你是老板,手下有两个员工,小张和小李。你命令小张注意小李,在开发软件工作的时候如果上网打游戏,你就记录下来,从小李工资里扣100元钱。这个实际上就是现实中的委托。
现在给出一个代码,C#控制台程序,编译运行通过
using System;
namespace CSharpConsole
{
public class 场景
{
[STAThread]
public static void Main(string[] args)
{
Console.WriteLine("场景开始了....");
// 生成小王
小王 w = new 小王();
// 生成小账
小张 z = new 小张();
// 指定监视
z.PlayGame += new PlayGameHandler(w.扣钱);
// 开始玩游戏
z.玩游戏();
Console.WriteLine("场景结束...");
Console.ReadLine();
}
}
// 负责扣钱的人
public class 小王
{
public 小王()
{
Console.WriteLine("生成小王...");
}
public void 扣钱(object sender,EventArgs e)
{
Console.WriteLine("小王:好小子,上班时间胆敢玩游戏...");
Console.WriteLine("小王:看看你小子有多少钱...");
小张 f = (小张)sender;
Console.WriteLine("小张的钱: " + f.钱.ToString());
Console.WriteLine("开始扣钱......");
System.Threading.Thread.Sleep(500);
f.钱 = f.钱 - 500;
Console.WriteLine("扣完了....现在小张还剩下:" + f.钱.ToString());
}
}
// 如果玩游戏,则引发事件
public class 小张
{
// 先定义一个事件,这个事件表示“小张”在玩游戏。
public event PlayGameHandler PlayGame;
// 保存小张钱的变量
private int m_Money;
public 小张()
{
Console.WriteLine("生成小张....");
m_Money = 1000; // 构造函数,初始化小张的钱。
}
public int 钱 // 此属性可以操作小张的钱。
{
get
{
return m_Money;
}
set
{
m_Money = value;
}
}
public void 玩游戏()
{
Console.WriteLine("小张开始玩游戏了.....");
Console.WriteLine("小张:CS好玩,哈哈哈! 我玩.....");
System.Threading.Thread.Sleep(500);
System.EventArgs e = new EventArgs();
OnPlayGame(e);
}
protected virtual void OnPlayGame(EventArgs e)
{
if(PlayGame != null)
{
PlayGame(this,e);
}
}
}
// 定义委托处理程序
public delegate void PlayGameHandler(object sender,System.EventArgs e);
}
相信你看完了后.豁然开朗了吧.HOHO!
http://www.akadia.com/services/dotnet_delegates_and_events.html
思归给的委托事件参考站点
public delegate void EatEventHandler(object sender, EatEventArgs e);
这个的定义也可以不要这样.可以直接就定义一个参数
public delegate void EatEventHandler(string e); 但然用的时候的参数要相对应好哦
using System;
namespace nsEventSample
{
/// <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("好的,正给您安排。。。。。。。。");
Console.WriteLine("主人,您的食物在这儿,请慢用");
}
}
/// <summary>
/// 类God安排qinshihuang(秦始皇)的仆人是lisi(李斯),并让李斯的ArrangeFood
/// 方法来处理qinshihuang的吃饭事件:qinshihuang.EatEvent += new EatEventHandler(lishi.ArrangeFood);
/// </summary>
public class God
{
public static void Main()
{
Master qinshihuang = new Master();
Servant lishi = new Servant();
qinshihuang.EatEvent += new EatEventHandler(lishi.ArrangeFood);
//秦始皇饿了,想去希尔顿大酒店,消费5000元
qinshihuang.Hungry("希尔顿大酒店", 5000.0m);
}
}
}
底二个例子
http://community.csdn.net/Expert/topic/2651/2651579.xml?temp=.7183191
比如说一个公司(场景),你是老板,手下有两个员工,小张和小李。你命令小张注意小李,在开发软件工作的时候如果上网打游戏,你就记录下来,从小李工资里扣100元钱。这个实际上就是现实中的委托。
现在给出一个代码,C#控制台程序,编译运行通过
using System;
namespace CSharpConsole
{
public class 场景
{
[STAThread]
public static void Main(string[] args)
{
Console.WriteLine("场景开始了....");
// 生成小王
小王 w = new 小王();
// 生成小账
小张 z = new 小张();
// 指定监视
z.PlayGame += new PlayGameHandler(w.扣钱);
// 开始玩游戏
z.玩游戏();
Console.WriteLine("场景结束...");
Console.ReadLine();
}
}
// 负责扣钱的人
public class 小王
{
public 小王()
{
Console.WriteLine("生成小王...");
}
public void 扣钱(object sender,EventArgs e)
{
Console.WriteLine("小王:好小子,上班时间胆敢玩游戏...");
Console.WriteLine("小王:看看你小子有多少钱...");
小张 f = (小张)sender;
Console.WriteLine("小张的钱: " + f.钱.ToString());
Console.WriteLine("开始扣钱......");
System.Threading.Thread.Sleep(500);
f.钱 = f.钱 - 500;
Console.WriteLine("扣完了....现在小张还剩下:" + f.钱.ToString());
}
}
// 如果玩游戏,则引发事件
public class 小张
{
// 先定义一个事件,这个事件表示“小张”在玩游戏。
public event PlayGameHandler PlayGame;
// 保存小张钱的变量
private int m_Money;
public 小张()
{
Console.WriteLine("生成小张....");
m_Money = 1000; // 构造函数,初始化小张的钱。
}
public int 钱 // 此属性可以操作小张的钱。
{
get
{
return m_Money;
}
set
{
m_Money = value;
}
}
public void 玩游戏()
{
Console.WriteLine("小张开始玩游戏了.....");
Console.WriteLine("小张:CS好玩,哈哈哈! 我玩.....");
System.Threading.Thread.Sleep(500);
System.EventArgs e = new EventArgs();
OnPlayGame(e);
}
protected virtual void OnPlayGame(EventArgs e)
{
if(PlayGame != null)
{
PlayGame(this,e);
}
}
}
// 定义委托处理程序
public delegate void PlayGameHandler(object sender,System.EventArgs e);
}
相信你看完了后.豁然开朗了吧.HOHO!
相关文章推荐
- 一些委托事件的工作原理.两个不错的例子
- 两个例子均用现实的例子来解释委托事件的处理过程
- 简单例子快速了解事件处理和委托 event delegate
- 本人系初中教师,爱好计算机,所以业余制作了一些小东西,渴望与大家分享,也希望得到大家的指导!
- 免费资料大放送大家好!我整理了一些免费it视频教程及电子书的资料,还不错,对开发入门或者是想提升技术高度的童鞋可能会比较有用,分享给大家,希望可以帮助到大家
- 专知原创和整理了一些中英文机器学习从入门到精通的资料,和大家分享一下
- IIS版面中经常看到大家问一些相同的或者以前已经多次解答的问题。所以,我将这些问题整理了一些出来供大家参考。
- c#事件,委托机制 这个例子非常好哦.提供源码,.一下子就了解了,还推荐去看 皮特的故事 要学委托 事件的话,
- 简单例子快速了解事件处理和委托 event delegate
- c语言中的比较函数大家了解吗?分享一些经验
- 整理了一些高质量的教程与大家分享
- 事件代理总结: 已经有一些使用主流类库的事件代理示例出现了,比如说jQuery、Prototype以及Yahoo! UI。你也可以找到那些不用任何类库的例子,比如说Usable Type blog上的这一个。一旦需要的话,事件代理将是你工具箱里的一件得心应手的工具,而且它很容易实现。
- 最近要写CMS,因为是学java的,所以找了一些开源的javaCMS学习,特别整理一下方便大家使用
- 分享一些常用的jQuery动画事件和动画函数
- 关于RDS 项目中Eclipse中用到RDS configure 不了解,所以找了一些资料看看。
- 一次偶然机遇找到一个不错的关于Android实现加载gif动画的实例,写一下分享个大家。
- 事件委托的例子
- 指针(详解)本人觉得写的很不错,所以拿出来分享
- 左右两个Select列表框交换数据的JS代码,上下左右都可以移动数据,还可以置顶、沉底,相信大家见到过,但觉得挺实用,与大家分享。
- perl文件操作的一些例子分享