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); }
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); }
留言
張貼留言