Study C#《事件的本质》

一、引言
 C#是个面向组件的程序,允许编写事件(Event),以便让对象以非同步的方式通知其他对象。实际上事件(Event)就是一个回呼(callback)的函数指针(Function Pointer),在C#中是通过delegate达成的。
二、描述
 1、原始方式(订阅者模式)
 比如:有一个人,有吃饭的方法,在吃完饭后他可以sleep/shopping。此时,您让他sleep,当他吃完饭后就sleep;您让他shopping,当他吃完饭后就shopping。代码如下

public delegate void EatCallBack //定义吃完饭要做什么模板(可带参数)
public class Human {
	public event EatCallBack eatCallBack //定义模板指针变量
	public Human(){} //构造器
	public virtual void Eat(){ //定义吃饭的虚方法
		eatCallBack(); //相当于回调了
	}
}
public class Test {
	public void shopping(){}; //定义shopping方法
	public void sleep(){}; //定义sleep方法
	public static int Main() {
		Human human = new Human(); //定义一个人
		//把sleep方法给了human中的模板指针(相当于注册/订阅)
		human.eatCallBack += new EatCallBack(sleep);
		human.Eat();//人开始吃饭,完了就开始sleep
	}
}

2、改进成注册

public delegate void EatCallBack //定义吃完饭要做什么模板(可带参数)
public class Human {
	public event EatCallBack eatCallBack = null; //定义模板指针变量
	public Human(){} //构造器
	public void AddEat(EatCallBack handler){ //添加注册方法
		if(this.eatCallBack == null){
			this.eatCallBack = handler;
		}else{
			this.eatCallBack += handler;
		}
	}
	public void RemoveEat(EatCallBack handler){ //删除注册方法
		this.eatCallBace -= handler;
	}
	public virtual void Eat(){ //定义吃饭的虚方法
		eatCallBack(); //相当于回调了
	}
}

public class Test {
	public void shopping(){}; //定义shopping方法
	public void sleep(){}; //定义sleep方法
	public static int Main() {
		Human human = new Human(); //定义一个人
		//把sleep方法给了human中的模板指针(相当于注册/订阅)
		human.AddEat(new EatCallBack(sleep));
		human.Eat();//人开始吃饭,完了就开始sleep
	}
}

3、传递事件参数(object sender,EatEventArgs e)
 由于要有EatEventArgs,所以要封装此类。sender为事件持有者。

public delegate void EatCallBack(object sender,EatEventArgs e) //定义吃完饭要做什么模板
public class Human {
	public event EatCallBack eatCallBack = null; //定义模板指针变量
	public Human(){} //构造器
	public Human(string name,string sex){ //构造器
		_name = name;
		_sex = sex;
	}
	public void AddEat(EatCallBack handler){ //添加注册方法
		if(this.eatCallBack == null){
			this.eatCallBack = handler;
		}else{
			this.eatCallBack += handler;
		}
	}
	public void RemoveEat(EatCallBack handler){ //删除注册方法
		this.eatCallBace -= handler;
	}
	public virtual void Eat(){ //定义吃饭的虚方法
		if(this.eatCallBack == null){ //没有注册
			return;
		}
		eatCallBack(this,new EatEventArgs(_name,_sex)); //相当于回调了
	}
	private string _name = "superMan";
	private string _sex = "man";
}
public class EatEventArgs:EventArgs { //事件类
	public EatEventArgs(string name,string sex){
		//里面可以放一些信息
	}
	//放此Get方法
}
public class Test {
	public void shopping(object sender,EatEventArgs e){ //定义shopping方法
		Console.WriteLine(e.name +":"+ e.sex + "shopping");
	};
	public void sleep(object sender,EatEventArgs e){ //定义sleep方法
		Console.WriteLine(e.name +":"+ e.sex + "sleep");
	};
	public static int Main() {
		Human human = new Human(); //定义一个人
		//把sleep方法给了human中的模板指针(相当于注册/订阅)
		human.AddEat(new EatCallBack(sleep));
		human.Eat();//人开始吃饭,完了就开始sleep
	}
}

----------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值