您的位置:首页 > 编程语言 > C#

C#学习笔记 委托和事件

2009-12-27 00:00 603 查看
一、委托的简介

1、委托的声明:

<access modifier> delegate <returnType> HandlerName ([parameters])

例如:

public delegate void PrintHandler(string str);

委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时封装一个实例和该实例上的一个方法。如果您有一个委托对象和一组适当的参数,则可以用这些参数调用该委托。

2、委托的使用

代码

namespace CSharpConsole
{

// 定义委托

public delegate void PlayGameHandler(object sender, System.EventArgs e);

// 负责扣钱的人----主管

public class 主管
{

public 主管()
{

Console.WriteLine("生成主管");

}

public void 扣薪水(object sender, EventArgs e)
{

Console.WriteLine("主管:好小子,上班时间胆敢玩游戏");

Console.WriteLine("主管:看看你小子有多少薪水");

员工 employee = (员工)sender;

Console.WriteLine("开始扣薪水...");

System.Threading.Thread.Sleep(1000);

employee.薪水 = employee.薪水 - 500;

Console.WriteLine("扣薪水执行完毕.");

}

}

// 如果玩游戏,则会引发事件

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(1000);

System.EventArgs e = new EventArgs();

OnPlayGame(e);

}

protected virtual void OnPlayGame(EventArgs e)
{

if (PlayGame != null)
{

PlayGame(this, e);

}

}

}

public class 场景
{

[STAThread]

public static void Main(string[] args)
{

Console.WriteLine("场景开始了.");

// 生成主管类的对象实例 小王

主管 小王 = new 主管();

// 生成员工类的对象实例 小张

员工 小张 = new 员工();

// 设下委托,指定监视

小张.PlayGame += new PlayGameHandler(小王.扣薪水);

Console.WriteLine("该员工本有的薪水:" + 小张.薪水.ToString());

// 员工开始玩游戏

小张.玩游戏();

Console.WriteLine("现在该员工还剩下:" + 小张.薪水.ToString());

Console.WriteLine("场景结束");

Console.ReadLine();

}

}

}

对于前面提出的问题:

1、 解耦了主管类和员工类之间的必然联系,可以单独创建员工类对象实例,而不用管是否有主管类对象实例的存在;

2、 在客户程序需求变化时:

(1)、我们只需修改客户程序,即上面例子里的class 场景,将委托改为如下:

保安 小李 = new 保安();

小张.PlayGame += new PlayGameHandler(小李. 扣薪水);

即可实现由保安来负责扣薪水的需求变化,而不用动员工类。

(2)、我们只需修改客户程序,即上面例子里的class 场景,添加一个如下的委托:

小张.PlayGame += new PlayGameHandler(某某. 扣绩效分);

这个“某某”可以是主管,也可以是其他新的角色(新的类),只需要在“某某”对应的类里定义扣绩效分的动作即可,而不用动员工类。

四、总结:

当然,不使用委托和事件我们仍然可以设计出解耦的类,然而却会增加很多的类、接口以及关联等等,增加了代码量和程序的逻辑复杂性,而在.net里利用委托和事件我们只需少的多的代码来实现。

委托和事件的使用有如下几个要素:

1、激发事件的对象-----就是员工小张
2、处理对象事件的对象-----就是主管小王
3、定义委托,就是你让主管小王监视员工小张。

如果这三个要素都满足的话,则你就写出了一个完整事件的处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: