2020-11-13

本文通过一个简单的‘生日事件’示例,详细讲解了C#中事件模式的实现步骤,包括事件源、事件关注者、事件委托类型、事件触发方法等关键概念。读者将了解如何使用委托和事件来实现对象间的通信,以及如何确保线程安全。
摘要由CSDN通过智能技术生成

【菜鸟的路上不寂寞】事件模式的实现

using System;
using System.Threading;

namespace BirthdayEventDemo
{
class Program
{
static void Main(string[] args)
{
//实例化一个事件源对象
Me eventSource = new Me(“菜鸟”);

		//实例化事件关注者
		Friend1 obj1 = new Friend1();
		Friend2 obj2 = new Friend2();

		//使用委托把对象及方法注册到事件中
		eventSource.BirthDayEvent += new BirthDayEventHandle(obj1.SendGift);
		eventSource.BirthDayEvent += new BirthDayEventHandle(obj2.Buycake);

		//事件到了触发生日事件,事件的调用
		eventSource.TimeUp();
		Console.Read();
	}
}
//第一步:定义一个类型用来保存所有需要发送给事件接收者的附加信息
public class BirthdayEventArgs:EventArgs
{
	//表示过生日人的姓名
	private readonly string name;

	public string Name
	{
		get {return name;}
	}

	public BirthdayEventArgs(string name)
	{
		this.name = name;
	}
}

//第二步:定义一个生日事件,首先需要定义一个委托类型,用于指定事件触发时被调用的方法类型
public delegate void BirthDayEventHandle(object sender,BirthdayEventArgs e);
//定义事件成员
public class Subject
{
	//定义生日事件
	public event BirthDayEventHandle BirthDayEvent;

	//第三步:定义一个负责引发事件的方法,它通知已关注的对象
	protected virtual void Notify(BirthdayEventArgs e)
	{
		//出于线程安全的考虑,现在将对委托字段的引用复制到一个临时字段中
		BirthDayEventHandle temp = Interlocked.CompareExchange(ref BirthDayEvent,null,null);
		if(temp != null)
		{
			//触发事件,与方法的使用方式相同
			//事件通知委托对象,委托对象调用封装的方法
			temp(this,e);
		}
	}
}
//定义触发事件的对象:事件源
public class Me:Subject
{
	private string name;
	public Me(string name)
	{
		this,name = name;
	}
	public void TimeUp()
	{
		BirthdayEventArgs eventarg = new BirthdayEventArgs(name);
		//生日到了,通知朋友们
		this.Notify(eventarg);
	}
}

//好友对象
public class Friend1
{
    public void SendGift(object sender,BirthdayEventArgs e)
    {
        Console.WriteLine(e.Name+" 生日到了,我要送礼物");
    }
}
public class Friend2
{
    public void Buycake(object sender, BirthdayEventArgs e)
    {
        Console.WriteLine(e.Name + " 生日到了,我要准备买蛋糕");
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值