委托和事件真是老生常谈了,最近QQ群里面很多人问这个问题,我从网上找了两个小故事,写成了例子,供大家参考。还是先说说什么是委托和事件吧。
C#中的委托是一种数据结构,提供类似C++中函数指针的功能,不同的是C++的函数指针只能指向静态方法,而委托除了可以指向静态方法之外,还可以指向对象实例的方法。事件是指当对象发生某些事件时,先其他对象提供通知的一种方法。在C#中,事件是通过委托实现的。事件有两个角色:一个是事件发送方,一个是事件接收方。事件发送方是指触发事件的对象,事件接收方是指注册想在某种事件发生时被通知的对象。其实,声明一个事件不过类似于声明一个进行了封装的委托类型的变量而已。
哎呀,看起来很绕口,举例说明:我们都订过杂志吧,一旦你订购了指定的杂志,当这些杂志发行时,就会将这些杂志送到你指定的地方(家里或单位),此时发行杂志的出版社就是事件的发送方,订购者就是事件的接收方。当杂志发行时,就触发一个发行事件,但是出版社并不是直接将杂志给订购者,而是委托邮局做这件事情,或者说邮局就是出版社的委托。
两个例子:
1、主人和仆人的故事:主人饿了要吃饭,告诉给仆人吃饭的地点和吃饭最多消费的金额,仆人来给主人进行吃饭的安排。
效果:
代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Example_Delegate_Event
{
//声明一个委托(吃饭)
public delegate void Eat(object sender,EatEventArgs e);
public partial class Form_EX1 : Form
{
//主人类实例化
Master master = new Master();
//仆人类实例化
Servant servant = new Servant();
public Form_EX1()
{
InitializeComponent();
this.txt_Event.Text = "主人和仆人的故事:/r/n 主人饿了要吃饭,告诉给仆人吃饭的地点和吃饭最多消费的金额,仆人来给主人进行吃饭的安排";
this.listBox1.Items.Add("主人说:“不行!有点饿了!”");
//注册事件如果主人饿了,仆人就安排吃饭
master.ToEat += new Eat(servant.ArrangeFood);
}
private void btn_OK_Click(object sender, EventArgs e)
{
master.Hungry(this.txt_Address.Text,this.txt_Money.Text);
for (int i = 0; i < servant.items.Length; i++)
{
this.listBox1.Items.Add(servant.items[i]);
}
}
}
//事件传递的自定义信息类
public class EatEventArgs : EventArgs
{
//吃饭的地点
private string _Address;
public string Address
{
get { return _Address; }
set { _Address = value; }
}
//最多消费金额
private string _Money;
public string Money
{
get { return _Money; }
set { _Money = value; }
}
}
//主人类
public class Master
{
public event Eat ToEat;
//主人饿了,要引发事件
public void Hungry(string Address,string Money)
{
EatEventArgs e = new EatEventArgs();
e.Address=Address;
e.Money=Money;
onEat(e);
}
//真正触发吃事件
protected virtual void onEat(EatEventArgs e)
{
if (ToEat != null)
ToEat(this,e);
}
}
// 仆人类
public class Servant
{
public object[] items = new object[6];
//事件的执行函数
public void ArrangeFood(object sender, EatEventArgs e)
{
items[0] = "仆人说:";
items[1] = " 我的主人, 您的命令是:";
items[2] = " 吃饭地点:" + e.Address+" 饭店 ";
items[3] = " 准备消费:" + e.Money+" 元";
items[4] = " 好的,正给您安排...............";
items[5] = " 主人,您的食物在这儿,请慢用!";
}
}
}
2、老板和员工的故事:老板监视员工干活,只要中间不许偷懒!游戏从员工工资扣除100元!抽烟扣50元!
代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Example_Delegate_Event
{
//定义一个委托:
public delegate void ToBeLazy(object sender, EventArgs e);
public partial class Form_EX2 : Form
{
Boss boss = new Boss();
Employee employee = new Employee("小张",1000);
public Form_EX2()
{
InitializeComponent();
this.txt_Event.Text = "老板和员工的故事:/r/n 老板监视员工干活,只要中间不许偷懒!游戏从员工工资扣除100元!抽烟扣50元!";
this.listBox1.Items.Add("【老板】:“你们努力工作啊,我不会亏待你们!”");
//注册一下这个事件
employee.ToPlay += new ToBeLazy(boss.CutWagesByPlay);
employee.ToSmoke += new ToBeLazy(boss.CutWagesBySmoke);
}
private void btn_Play_Click(object sender, EventArgs e)
{
this.listBox1.Items.Add("");
this.listBox1.Items.Add("【"+employee.Name+"】:委托事件看的头疼,玩会CS!");
this.listBox1.Items.Add("【" + employee.Name + "】:爆头了!CS 真好玩!");
this.listBox1.Items.Add("========老板不知不觉进来了===========");
//发现玩游戏
this.listBox1.Items.Add("【老板】:你小子玩游戏!你原工资是 "+employee.Wages+" 元");
employee.Paly();
this.listBox1.Items.Add("【老板】:扣除100元!你现在工资是 "+employee.Wages+" 元");
}
private void btn_Smoke_Click(object sender, EventArgs e)
{
this.listBox1.Items.Add("");
this.listBox1.Items.Add("【" + employee.Name + "】:累了抽根烟!");
//发现玩抽烟
this.listBox1.Items.Add("【老板】:你小子又抽烟!你原工资是 " + employee.Wages + " 元");
employee.Smoke();
this.listBox1.Items.Add("【老板】:扣除50元!你现在工资是 " + employee.Wages + " 元");
}
}
//员工类
class Employee
{
public event ToBeLazy ToPlay;
public event ToBeLazy ToSmoke;
public Employee(string Name,int Money)
{
//初始化员工姓名和工资
this._Name = Name;
this._Wages = Money;
}
//员工姓名
private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
//员工工资
private int _Wages ;
public int Wages
{
get { return _Wages ; }
set { _Wages = value; }
}
//引发玩事件函数(玩)
public void Paly()
{
System.EventArgs e = new EventArgs();
OnPlay(e);
}
//真正触发了玩事件
public void OnPlay(EventArgs e)
{
if (ToPlay != null)
ToPlay(this, e);
}
//引发抽烟事件(抽)
public void Smoke()
{
System.EventArgs e = new EventArgs();
OnSmoke(e);
}
//真正触发了抽烟事件
public void OnSmoke(EventArgs e)
{
if (ToSmoke != null)
ToSmoke(this, e);
}
}
//老板类
class Boss
{
public Boss()
{
//老板初始化
}
//事件触发后的执行函数 不用问 当然是 减工资了
//游戏-100
public void CutWagesByPlay(object sender,EventArgs e)
{
Employee employee = (Employee)sender;
employee.Wages -= 100;
}
//抽烟-50
public void CutWagesBySmoke(object sender, EventArgs e)
{
Employee employee = (Employee)sender;
employee.Wages -= 50;
}
}
}
以上代码均有 闭着眼睛想~ 原创 仅供参考,不得转载!