C# 的委托與事件具體是怎么一回事

C# 的委托與事件具體是怎么一回事
委托的弊端
1、調(diào)用委托時,如果其中的一個委托報錯,則后面的不會被調(diào)用;
2、只有最后一個的返回值才會作為委托的返回值;
3、因為是數(shù)組,所以remove 的復(fù)雜度是O(n);
4、線程不安全。
委托為什么不等于函數(shù)指針?
1、委托可以“指向”多個函數(shù);
2、委托可以指向同一個函數(shù)多次;
3、函數(shù)是包含在類中的,所以函數(shù)引用也包含了所在對象的信息;而C/C++的函數(shù)指針只是函數(shù)的入口地址。
?
委托的異步調(diào)用 BeginInvoke[不推薦使用]
比較古老,.NET Core 之后也不實現(xiàn)該方法了。

可使用 Task async/await 等進行替代,包括 WPF 中也是一樣。
?
事件的本質(zhì)
事件說白了是C#提供的語法糖,效果是:
1.將委托以私有變量的形式封裝在類內(nèi),不讓外面訪問;
2.對于委托進行了封裝,從而定義add與remove方法;
3.在add與remove中通過互鎖的方式提供了線程安全性。
?
給事件定制化 Add/Remove
以 WPF 的 MVVM 模式中的 RelayCommand 為例:

?
標(biāo)簽: