“委托是具有相同簽名的函數(方法)的類型,事件是委托的應用方式之一” ---來自評論區老司機
delegate 是為了在C#中把函數作為對象傳來傳去而實現的一個“函數包裝”。由於在C#中函數是二等公民,你不能把它定義在class的層級上,也不能把它作為對象來傳遞。因此平台提供了一個盛放函數的“容器“,當你聲明了一個這樣的容器后,它里面就可以放進所有和你聲明時簽名一致的函數或方法。
因為每次聲明和創建委托都是在做重復性的工作,不符合OOP的氣質,微軟提供了泛型委托:
Action 無參沒有返回值的委托
Action<> 沒有返回值的泛型委托
Func<> 有返回值的泛型委托
Predicate<> 返回bool值,一個參數
public delegate typeA MyDelegate(typeB b,typeC c); MyDelegate thisDelegate = (i,j) => new typeA();
等價於:
Func<typeB,TypeC,TypeA> thisDelegate = (i,j) => new typeA(); //前兩個是參數,最后一個是返回值類型
C#中的event不是一個類型,而是與“字段”、"屬性“、”方法“ 並列的類成員之一。可以理解為delegate是一個類,event是delegate類下的一個字段。event是delegate的應用方式之一。
事件是類或對象向其他類或對象通知發生的事情的一種特殊簽名的委托。
事件的+=、-=操作符可以在類的外部使用,調用事件只能在聲明事件的類的內部使用。