委托
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,
这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
委托可以认为是包含具有相同签名和返回值的有序方法列表,当委托被调用时,它调用列表中的每个方法
委托类型声明以delegate关键词开头,没有方法主体
委托声明方法
delegate void MyDel(int x);
事件
事件就好像被简化的针对特殊用途的委托
事件接受类型的返回值与委托匹配的事件处理程序
事件不是成员,不能使用对象创建表达式(new)来创建他们
由于事件不是成员: 必须声明在类或结构中,和其他成员一样 不能在一段可执行代码中声明事件
事件成员被隐式自动转化为null
private event MyDel myE;
public event MyDel MyE
{
add { myE += value; }
remove { myE -= value; }
}
例如:
老鼠无聊想玩游戏,他就得将要玩游戏的时间通知给耗子,然后由耗子来执行老鼠所要做的事- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace Csharp面向对象_事件练习
- {
- /// <summary>
- /// 类PlayEventArgs 必须继承自类EventArgs,用来引发事件时封装数据
- /// </summary>
- public class PlayEventArgs : EventArgs
- {
- public String Play; //游戏名称名称
- public decimal moneyOut; //准备消费金额
- }
- /// <summary>
- /// 这个委托用来说明处理玩游戏事件的方法的方法头(模式)
- /// </summary>
- public delegate void PlayEventHandler(object sender, PlayEventArgs e);
- /// <summary>
- /// 引发玩游戏事件(PlayEvent)的类Master(主人),这个类必须
- /// 1.声明一个名为PlayEvent的事件: public event PlayEventHandler PlayEvent;
- /// 2.通过一个名为OnPlayEvent的方法来引发吃饭事件,给那些处理此事件的方法传数据;
- /// 3.说明在某种情形下引发事件呢?在想玩游戏的时候。用方法PalyDota来模拟。
- /// </summary>
- public class Master
- {
- //声明事件
- public event PlayEventHandler PalyEvent;
- //引发事件的方法
- public void OnPlayEvent(PlayEventArgs e)
- {
- if (PalyEvent != null)
- {
- PalyEvent(this, e);
- }
- }
- //当主人想玩游戏的时候,他会指定所玩游戏和消费金额。
- public void PlayDota(String restrauntName, decimal moneyOut)
- {
- PlayEventArgs e = new PlayEventArgs();
- e.Play = restrauntName;
- e.moneyOut = moneyOut;
- Console.WriteLine("主人说:");
- Console.WriteLine("我无聊,要去玩{0},消费{1}元", e.Play, e.moneyOut);
- //引发事件
- OnPlayEvent(e);
- }
- }
- /// <summary>
- /// 类Servant(仆人)有一个方法Arrange(安排)来处理主人的玩游戏事件
- /// </summary>
- public class Servant
- {
- public void Arrange(object sender, PlayEventArgs e)
- {
- Console.WriteLine();
- Console.WriteLine("耗子说:");
- Console.WriteLine("您的命令是 : ");
- Console.WriteLine("要玩的游戏 -- {0}", e.Play);
- Console.WriteLine("准备消费 -- {0}元 ", e.moneyOut);
- Console.WriteLine("好的,正给您安排。。。。。。。。\n");
- System.Threading.Thread.Sleep(5000);//系统等待时间 5秒
- Console.WriteLine("您的日程已经安排");
- }
- }
- /// <summary>
- /// 类God安排mouse的仆人是hz,并让hz的Arrange
- /// 方法来处理mouse的吃饭事件:mouse.PlayEvent += new PlayEventHandler(hz.Arrange);
- /// </summary>
- public class God
- {
- public static void Main(String[] args)
- {
- Master mouse = new Master();
- Servant hz = new Servant();
- mouse.PalyEvent += new PlayEventHandler(hz.Arrange);
- //老鼠想玩游戏,要玩Dota,准备消费50元
- mouse.PlayDota("Dota", 50.0m);
- Console.ReadKey();
- }
- }
- }
复制代码 |