事件与委托

1.基本写法

public class Publisher
{
    //委托实际上相当于声明一个函数指针
    public delegate void PublishEventHandler();
    //事件相当于保存一个函数指针集合
    public event PublishEventHandler Publish;

    public void OnPublish()
    {
        if (Publish != null)
        {
            //调用事件
            this.Publish();
        }
    }
}

public static void Recieve()
{
    Console.WriteLine("Hello World");
}

public static void Main(string[] args)
{
    Publisher publisher = new Publisher();
    //对事件注册委托
    publisher.Publish += new Publisher.PublishEventHandler(Receive);
    //触发事件
    publisher.OnPublish();
}

2.标准写法

//被观察者
public class Publisher
{
    //委托的命名以EventHandler结束,参数第一个是sender,第二个是关于这个事件的参数类
    public delegate void PublishEventHandler(object sender, PublishEventArgs e);
    //事件的命名以Event结束
    public event PublishEventHandler PublishEvent;
    //引发事件以On开头
    public void OnPublishEvent(PublishEventArgs e)
    {
        if(PublishEvent!=null)
        {
            this.PublishEvent(this, e);
        }
    }
}
//观察事件的参数
publish class PublishEventArgs: EventArgs
{
    private string _bookname;
    public string bookName
    {
        get{ return _bookname;}
        set{ _bookname = value;}
    }

    public PublishEventArgs(string bookname)
    {
        this._bookname= bookname;
    }
}

static void Main(string[] args)
{

    Publisher publisher = new Publisher();
    //注册事件
    publisher.PublishEvent += new Publisher.PublishEventHandler(Receieve);
    //构造事件参数然后引发事件
    publisher.OnPublishEvent(new PublishEventArgs("para"));
    Console.Read();
}

3.EventHandler写法

//观察事件参数
public class PublishEventArgs : EventArgs
{
    private string _bookname;

    public string bookName
    {
        get { return _bookname; }
        set { _bookname = value; }
    }

    public PublishEventArgs(string bookname)
    {
        this._bookname = bookname;
    }
}
//被观察者
public class Publisher
{
    //public delegate void PublishEventHandler(object sender, PublishEventArgs e);
    //这里不用再声明委托了,只用按照如下方式进行声明,则Pushlish对应的委托类型为(object sender, PublishEventArgs e)
    public event EventHandler<PublishEventArgs> Publish;

    public void OnPublishEvent(PublishEventArgs e)
    {
        //这里有简洁的写法Publish?.Invoke(this, e);
        if (Publish != null)
        {
            Publish(this, e);
        }
    }
}
//观察者
public class User
{
    public void Receieve(object sender, PublishEventArgs e)
    {
        Console.WriteLine(e.bookName + "Hello World!");
    }
}

class Program
{

    static void Main(string[] args)
    {

        Publisher publisher = new Publisher();
        User Tom = new User();
        publisher.Publish += Tom.Receieve;

        publisher.OnPublishEvent(new PublishEventArgs("para"));
        Console.Read();

    }
}

results matching ""

    No results matching ""