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、定义委托,就是你让主管小王监视员工小张。
如果这三个要素都满足的话,则你就写出了一个完整事件的处理。
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、定义委托,就是你让主管小王监视员工小张。
如果这三个要素都满足的话,则你就写出了一个完整事件的处理。
相关文章推荐
- C#学习笔记(三)—–C#高级特性中的委托与事件(下)
- 【unity3d-C#学习笔记】C#中的委托和事件
- 精通C#学习笔记之事件(一)使用委托的弊端
- C#与.NET4 高级程序设计-----委托、事件 学习笔记
- C#中的委托、事件学习笔记
- C#委托,事件最初浅的和最易看懂的学习笔记
- C#学习笔记19-委托和事件
- [读书笔记]C#学习笔记二: 委托和事件的用法及不同.
- [学习笔记]c#中的委托、事件、Func、Predicate、Observer设计模式以及其他
- 《C#高级编程》学习笔记------C#中的事件和委托
- C#学习笔记8——C# 中的委托和事件
- [读书笔记]C#学习笔记二: 委托和事件的用法及不同
- 学习笔记之---C#中的委托与事件
- 《C#高级编程》学习笔记------C#中的委托和事件(续)
- 学习笔记之---C#中的委托与事件
- C#事件 委托 学习笔记
- C#学习笔记之三:C#接口与事件委托
- [读书笔记]C#学习笔记二: 委托和事件的用法及不同.
- [C#]C#学习笔记-委托,事件
- C#委托与事件学习笔记