close

***委派概念***

「委派型別」代表對方法的參考,用來封裝函式。

其中含有特定參數清單與傳回型別,和interface有些類似,但不需要另外以執行個體封裝。

將方法視為實體,而實體能指派給變數或當作參數來傳遞。

類似在其他語言中的函數指標Function pointer的概念。但與函數指標不同,委託是物件導向Object oriented的和型別安全Type safe的,底層與反射Reflection有關。

委派不知道或不關心引用的方法類別;重要的是所引用的方法具有與委託相同的參數和返回類型

delegate類別就是委派類型的基類Base class。不會視為委派類型Delegate type; 它是用來衍生Derive委派類型的類別。

而委派是委派類型的實例。

 

//委派基類 delegate、委派類型testDelegate及委派td,其實作方法為null
public delegate void testDelegate();
testDelegate td = null;

 


 

***基本使用***

委派的演進共有三種 : 具名委派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撰寫,如何實作具名委派

//宣告一個回傳int沒有參數的委派類型
delegate int SpendWay();
//此處有兩個回傳不同數值的function
public int Normal() => 100;
public int EndMonth() => 35;
 
public int EatLunch()
{
    //選擇給定要傳入委派類型的委派
    SpendWay spendWay = new SpendWay(Normal);
    if (DateTime.Now.Day > 15
    {
        spendWay = new SpendWay(EndMonth);
    }
 
    //使用該委派
    return spendWay();
}

 

**匿名委派Anonymous Delegate**

在給委派型別spendWay指派function時,使用次數少的狀況下也需要具名委派,對開發人員也是一件辛苦的事,因此出現了匿名委派(匿名函式)

  • 用delegate運算子
    spendWay = delegate(){ return 200; };
  • 用Lambda運算式
    spendWay = () => 50;

 

**通用委派General Delegate**

除此之外delegate還有相關的類型Func & Action,就另開一篇說明~

 


 

***進階應用***

範例二(此是來自Microsoft Docs修改為簡略版)

//一樣先宣告一個委派,傳入參數和回傳都是double
delegate double funct(double x);
 
static double Square(double x)
{
    return x * x;
}
//此方法需要一個符合委派型別funct的參數
static double[] Apply(double[] afunct f)
{
    double[] result = new double[a.Length];
    for (int i = 0i < a.Lengthi++) result[i] = f(a[i]);
    return result;
}
static void Main()
{
    double[] a = {0.00.51.0};
    double[] squares = Apply(aSquare);
    double[] sines = Apply(aMath.Sin);
}

Apply不需管傳入的參數,只要其與委派型別funct一致。

委派型別funct的執行個體 可以參考任何採用 double 引數並傳回 double 值的方法。

委派可以參考靜態方法 (例如上一個範例中的 Square 或 Math.Sin),或是參考執行個體方法。

參考執行個體方法的委派也會參考特定的物件,而且透過委派來叫用執行個體方法時,該物件就會變成叫用中的 this。

補充 : 

this在靜態屬性、方法或是靜態欄位初始設定式中無效。

在個體物件的function中,this表為該物件。

 

 

 

 

 


 

資料來源 : 

Microsoft Docs - C# 委派

茅塞頓開的一晚-Func 委派+匿名方法+lambda

Microsoft Docs - Delegate Class

The Delegates in C#

[.NET] 由委派演進到 Lambda Expression ( 小朱大大這篇前因後果寫得非常清楚,非常推薦 )

arrow
arrow
    文章標籤
    C# 委派 delegate
    全站熱搜
    創作者介紹
    創作者 律晴音 的頭像
    律晴音

    聆風之境

    律晴音 發表在 痞客邦 留言(0) 人氣()