C# delegate/method adaptor/lambda expression

C# delegate

delegate 就是一個指向 method 的 pointer。

delegate void FuncDelegate();

可以利用 += 將 method pointer 指派給它。

FuncDelegate += Func1;
FuncDelegate += Func2;

上例假使呼叫 FuncDelegate() 後,先執行 Func1() 然後是 Func2()。注意 delegate 宣告是沒有參數輸入,故指派給它的 method 也是要無參數輸入的。

將 method pointer 移出 delegate,使用 -=:

FuncDelegate -= Func2;


C# method adaptor

上例中指派 method pointer 到 delegate 必需不帶參數的 method,那如果其中一個 method 要帶參數呢?這時我們可以產生另一個 method:

void Func3()
{
   Func2(99);
}

然後就可以利用

FuncDelegate += Func1;
FuncDelegate += Func3;

上例中呼叫 Func3 就等於 Func2(99)。這裡 Func3() 就叫作 method adaptor。它 convert(或稱 adapt)某個 method 來給它新的 signature。

method adaptor 並不好用,在大程式中要使用它還真麻煩。以上例而言,我們還要特別宣告一個 Func3 來才行。有一個更好的辦法就是使用 lambda expression。


C# lambda expression

剛剛上例中,用 lambda expression 便可以改寫成:

FuncDelegate += () => { Func2(99); }

其中 () 代表參數。此例中無參數,所以就直接寫 ()。而 => 之後代表為 lambda expression,它也可以有多行的程式碼。下面是有帶參數 delegate 的 lambda expression:

(x, y) => { return x + y; }

參數中可以不必指定 data type。C# 會自己透過程式碼判斷。但如果要指定也是可以的:

(int x, int y) => { return x + y; }

事實上 lambda expression 是在 C# 3.0 才出現的。在 C# 2.0 中要使用 anonymous method:

FuncDelegate += delegate { Func2(99); }

留言

熱門文章