1. 程式人生 > >C# event和delegate的區別

C# event和delegate的區別

簡單的說,event是特殊的delegate,遠古版本(不知道是C#幾點零之前)只有delegate,後來發現delegate的使用不夠好,

比如在應該使用+=的時候誤用=,就把訂閱的事件都清了,後來封裝了一手event,同時仍然保留delegate(相容老版本?)。

具體區別,event和delegate的功能一樣,event多了一些限制

封裝訂閱:有的地方應該用+=卻誤用=,event取消=,在宣告事件的類外部只用 += 和 -= 操作,但是在類內親測仍能用 = 操作事件 封裝釋出:外部可以直接呼叫委託來發布訊息,event只能有類內部呼叫,不會無緣無故釋出訊息

注意

1、event和delegate不用new,沒有訂閱者的時候是null,有訂閱者則不為空。

2、釋出事件要檢查是否為空,C#6.0可以這樣寫exampleEvent?.Invoke();,這是一個空值判斷表示式,帶‘?’。

3、event賦值返回的不是引用而是一個新的事件,所以可以用一下方法在多執行緒中安全的使用event

midEvent = exampleEvent;
if(midEvent != null) midEvent.Invoke();
如果exampleEvent在其他執行緒被修改了也不影響,但可能剛剛加入的一個訂閱者沒有收到這個釋出或者一個訂閱者被

清除卻收到了這個釋出的訊息,這就需要程式具有足夠的健壯性了(以上從書上看來,本人很菜寫不出這些)

有寫錯的歡迎留言~