第一个例子
public delegate void EatEventHandler(object sender, EatEventArgs e); 这个的定义也可以不要这样.可以直接就定义一个参数
public delegate void EatEventHandler(string e); 但然用的时候的参数要相对应好哦
using System;
namespace nsEventSample {
///
/// 类EatEventArgs 必须继承自类EventArgs,用来引发事件时封装数据 ///
public class EatEventArgs : EventArgs {
public String restrauntName; //饭店名称
public decimal moneyOut; //准备消费金额 }
///
/// 这个委托用来说明处理吃饭事件的方法的方法头(模式) ///
public delegate void EatEventHandler(object sender, EatEventArgs e);
///
/// 引发吃饭事件(EateEvent)的类Master(主人),这个类必须
/// 1.声明一个名为EatEvent的事件: public event EatEventHandler EatEvent; /// 2.通过一个名为OnEatEvent的方法来引发吃饭事件,给那些处理此事件的方法传数据;
/// 3.说明在某种情形下引发事件呢?在饿的时候。用方法Hungrg来模拟。 ///
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.moneyOut);
//引发事件 OnEatEvent(e); } }
///
/// 类Servant(仆人)有一个方法ArrangeFood(安排食物)来处理主人的吃饭事件 ///
public class Servant {
public void ArrangeFood(object sender, EatEventArgs e) {
Console.WriteLine();
Console.WriteLine(\仆人说:\
Console.WriteLine(\我的主人, 您的命令是 : \
Console.WriteLine(\吃饭地点 -- {0}\ Console.WriteLine(\准备消费 -- {0}元 \ Console.WriteLine(\好的,正给您安排。。。。。。。。\ Console.WriteLine(\主人,您的食物在这儿,请慢用\ } }
///
/// 类God安排qinshihuang(秦始皇)的仆人是lisi(李斯),并让李斯的ArrangeFood /// 方法来处理qinshihuang的吃饭事件:qinshihuang.EatEvent += new EatEventHandler(lishi.ArrangeFood); /// public class God {
public static void Main() {
Master qinshihuang = new Master();
Servant lishi = new Servant();
qinshihuang.EatEvent += new EatEventHandler(lishi.ArrangeFood);
//秦始皇饿了,想去希尔顿大酒店,消费5000元 qinshihuang.Hungry(\希尔顿大酒店\ } } }
第二个例子来源于:
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(\小张的钱: \钱.ToString()); Console.WriteLine(\开始扣钱......\ System.Threading.Thread.Sleep(500); f.钱 = f.钱 - 500;
Console.WriteLine(\扣完了....现在小张还剩下:\钱.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); }
[翻译].NET委托:一个C#睡前故事 [推荐] .NET委托:一个C#睡前故事
英文版原作者:Chris Sells(www.sellsbrothers.com)
翻译:袁晓辉(www.farproc.com http://blog.csdn.net/uoyevoli)
紧耦合
从前,在南方一块奇异的土地上,有个工人名叫彼得,他非常勤奋,对他的老板总是百依百顺。但是他的老板是个吝啬的人,从不信任别人,坚决要求随时知道彼得的工作进度,以防止他偷懒。但是彼得又不想让老板呆在他的办公室里站在背后盯着他,于是就对老板做出承诺:无论何时,只要我的工作取得了一点进展我都会及时让你知道。彼得通过周期性地使用“带类型的引用”(原文为:“typed reference” 也就是delegate??)“回调”他的老板来实现他的承诺,如下: class Worker {
public void Advise(Boss boss) { _boss = boss; } public void DoWork() {
Console.WriteLine(“工作: 工作开始”); if( _boss != null ) _boss.WorkStarted();