首先延續前一篇:
委託是一種類型,事件是委託類型的一個實例,加上一個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();
}
結果: