我们使用委托主要是为了将方法作为参数进行使用
public delegate type functiondeleate();
而通过functiondelegate.beginInvoke可以实现线程的作用
但是使用委托却难以达到较好的封装性,我们不能把委托类型声明为private,但我们
要达到一定的封装性,故事件诞生
public event functiondelegate function
不管我们将事件声明为公有还是私有,事件都是私有,事件的发布者即事件所在的类可以间接
使用事件,但不可直接使用事件,就像在类中定义了一个私有变量,而在类的实例中不可直接
使用此变量,需要通过类的另一个函数使用此变量
using System;
class Program
{
static void Main(string[] args)
{
Publishser pub = new Publishser();
Subscriber sub = new Subscriber();
pub.NumberChanged += new NumberChangedEventHandler(sub.OnNumberChanged);
pub.DoSomething(); // 应该通过DoSomething()来触发事件
//pub.NumberChanged(100);此处会报错, event可以看成是私有成员,其发布者不可直接访问,
//这类似于在类中声明一个私有变量,这样做的原因是delegate不可声明为私有
//类型,但我们要使其具有较好的封装性,则将它声明为event可达到效果
}
}
/// <summary>
/// 定义委托
/// </summary>
/// <param name="count"></param>
public delegate void NumberChangedEventHandler(int count);
/// <summary>
/// 定义事件发布者
/// </summary>
public class Publishser
{
private int count;
//public NumberChangedEventHandler NumberChanged; // 声明委托变量
public event NumberChangedEventHandler NumberChanged; // 声明一个事件
public void DoSomething()
{
// 在这里完成一些工作 ...
if (NumberChanged != null) // 触发事件
{
count++;
NumberChanged(count);
}
}
}
/// <summary>
/// 定义事件订阅者
/// </summary>
public class Subscriber
{
public void OnNumberChanged(int count)
{
Console.WriteLine("Subscriber notified: count = {0}", count);
}
}