***委派概念***
「委派型別」代表對方法的參考,用來封裝函式。
其中含有特定參數清單與傳回型別,和interface有些類似,但不需要另外以執行個體封裝。
將方法視為實體,而實體能指派給變數或當作參數來傳遞。
類似在其他語言中的函數指標Function pointer的概念。但與函數指標不同,委託是物件導向Object oriented的和型別安全Type safe的,底層與反射Reflection有關。
委派不知道或不關心引用的方法類別;重要的是所引用的方法具有與委託相同的參數和返回類型。
delegate類別就是委派類型的基類Base class。不會視為委派類型Delegate type; 它是用來衍生Derive委派類型的類別。
而委派是委派類型的實例。
***基本使用***
委派的演進共有三種 : 具名委派Named Delegate、匿名委派Anonymous Delegate及通用委派General Delegate。
.NET Framework 1.0, 1.1 => 具名委派 ↓ .NET Framework 2.0 => 匿名委派 ↓ .NET Framework 3.0 Lambda Expression ↓ .NET Framework 3.5 => 通用委派 (General Delegates) |
**具名委派Named Delegate**
以下範例故意以delegate撰寫,如何實作具名委派
**匿名委派Anonymous Delegate**
在給委派型別spendWay指派function時,使用次數少的狀況下也需要具名委派,對開發人員也是一件辛苦的事,因此出現了匿名委派(匿名函式)
- 用delegate運算子
spendWay = delegate(){ return 200; };
- 用Lambda運算式
spendWay = () => 50;
**通用委派General Delegate**
除此之外delegate還有相關的類型Func & Action,就另開一篇說明~
***進階應用***
範例二(此是來自Microsoft Docs修改為簡略版)
Apply不需管傳入的參數,只要其與委派型別funct一致。
委派型別funct的執行個體 可以參考任何採用 double 引數並傳回 double 值的方法。
委派可以參考靜態方法 (例如上一個範例中的 Square 或 Math.Sin),或是參考執行個體方法。
參考執行個體方法的委派也會參考特定的物件,而且透過委派來叫用執行個體方法時,該物件就會變成叫用中的 this。
補充 : this在靜態屬性、方法或是靜態欄位初始設定式中無效。 在個體物件的function中,this表為該物件。 |
資料來源 :
Microsoft Docs - Delegate Class
[.NET] 由委派演進到 Lambda Expression ( 小朱大大這篇前因後果寫得非常清楚,非常推薦 )