首先延续前一篇:
委托是一种类型,事件是委托类型的一个实例,加上一个event 关键字的权限控制
我的理解就好比
有一个类 叫 Student, 而 事件就是 Student 的一个实例
new 小美 = new student(){爸爸= "班主任", 颜值=颜值.超模级别}
叫小美,但是小美很特殊,她是班主任的女儿,那也就只能发生一些平常的交互了,想要谈恋爱是没可能了,权限被控制的
event 关键字就好比 不能撩
那么转回正题:
事件(观察者模式)的作用就是完成固定动作 ,把可变动作分离出去,由外部控制,可以随意扩展
搭建框架时恰好就需要这个特点,通过事件分离可变动作,支持拓展
WinFrom中事件的使用:
event 为什么要加权限控制?
就是为了避免外部乱改
先看一下 EventHandler 这个委托
在WinFrom 可以很高频率的看见这个委托, 都是将它实例化为 event 来 做点击或其他事件的触发
结合搞Javascript 的经验这个 object 和 EventArgs 就类似事件源对象 ,再看一眼 Eventargs 这个类
看起来也是空空的 ,基本上都是自己继承继承以后,自己来规定要返回的事件信息,后面会有示例
标准event 使用实例:
发布者:
public class IphoneX
{
public string Type { get; set; }
private decimal _Price;
public decimal Price {
get { return _Price; }
set
{
if (value < this._Price)
{
this.DiscountHandler?.Invoke(this, new XEventArgs() {
OldPrice = this.Price,
NewPrice = value
});
}
_Price = value;
}
}
public event EventHandler DiscountHandler;
}
public class XEventArgs : EventArgs
{
public decimal NewPrice { get; set; }
public decimal OldPrice { get; set; }
}
订阅者:
public class Subscriber
{
public string Name { get; set; }
public void SubscribMsg(object goods, EventArgs args)
{
var realArgs = (XEventArgs)args;
var realGoods = (IphoneX)goods;
Console.WriteLine($" {this.Name}!, {realGoods.Type} IphoneX 降价了 从 {realArgs.OldPrice }降到了{realArgs.NewPrice}!");
}
}
绑定关系:
static void Main(string[] args)
{
var iphoneX = new IphoneX()
{
Type = "国内版",
Price = 6000
};
iphoneX.DiscountHandler += new Subscriber() { Name = "小美" }.SubscribMsg;
iphoneX.Price = 5000;
iphoneX.Price = 4000;
iphoneX.Price = 3000;
iphoneX.Price = 6000;
Console.Read();
}
结果: