登山-C#-事件

以前也断断续续看过关于C#的事件的知识,长时间不用忘记了,总结下来还是自己学习得不够深刻,不能有自己的理解。

这次静下心来仔细学了一下,有了一些自己的理解,记录一下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EventLearn
{
    //這個地方應該是放一些要通知用戶的內容
    public class CarInfoEventArgs : EventArgs
    {
        public CarInfoEventArgs(string car)
        {
            this.Car = car;
        }
        public string Car { get; private set; }//除了這個屬性,我們還可以放一些其他的內容。
    }
    

    public class CarDealer
    {
        public event EventHandler<CarInfoEventArgs> NewCarInfo;
        /*NewCarInfo是事件;作為一個約定,事件一般有兩個參數,第一個是一個對象,包含事件的發送者,第二個提供了事件的相關信息
         *這個事件供用戶來訂閱
         */
        //NewCar用來觸發事件,操作在商家手裡
        public void NewCar(string car)
        {
            Console.WriteLine("CarDealer,new car {0}",car);
            if (NewCarInfo != null)
            {
                NewCarInfo(this, new CarInfoEventArgs(car));
            }
        }
    }

    public class Consumer
    {
        private string name;
        public Consumer(string name)
        {
            this.name = name;
        }
        //將NewCarIsHere視為用戶訂閱的工具,這是實現了委託的方法。
        public void NewCarIsHere(object sender, CarInfoEventArgs e)
        {
            Console.WriteLine("{0}:car is new", name, e.Car);//除了簡單的輸出語句,其實可以根據e中的內容做更複雜的事情。
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var dealer = new CarDealer();
            var michael = new Consumer("Michael");
            dealer.NewCarInfo += michael.NewCarIsHere;//這應當是用多播委託,實現方法返回值為void
            dealer.NewCar("Mercedes");
            var nick = new Consumer("nick");
            dealer.NewCarInfo += nick.NewCarIsHere;
            dealer.NewCar("Ferrari");
            dealer.NewCarInfo -= michael.NewCarIsHere;//取消監聽
            dealer.NewCar("Toyota");
        }
    }
}

事件,可以想象成---汽车商家CarDealer进了一辆新车,他想把这个消息告诉他的顾客。顾客想要收到这个好消息自然要有一个渠道来获得。他们之间的联系就在于NewCarInfo这个事件了。

类CarInfoEventArgs ,就是一个放置消息内容的地方,比我们可以放新车的品牌,颜色,价格等信息。这上面的程序只放置了Car这个属性代表品牌。必须继承自EventArgs。

CarDealer类中的public event EventHandler<CarInfoEventArgs> NewCarInfo;实质上是一个委托的简写。

在消费者Consumer类中写了一个NewCarIsHere的方法,可以视为委托的一个实现方法。

在Main函数中我们看到了多播委托,使得用户订阅或是退订汽车商家的消息。dealer一调用NewCar之后就等于喊了一嗓子“我进了一辆新车,快来买吧”,客户就会被通知到。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值