我们使用委托主要是为了将方法作为参数进行使用

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);
    }
}


本文转载:CSDN博客