委派 Delegate

委派:delegate

  • 它的本質上是一個Class,主要用來定義method的類型
  • 可以把它想像為一個定義method容器,用來儲存要傳遞的method。
  • 使用委派讓你可以在呼叫method先處理一些邏輯,當這些邏輯處理完之後,在傳入這些method。

以下是他的語法

1
存取修飾詞 delegate 返回值 委派名(參數列表);
  • 如果沒寫存取修飾詞的話,預設為public的,
  • 若取修飾詞寫為private的話,則其他namespace不可以使用
  • 委派的method參數必須要對應

宣告範例

1
2
3
4
5
// 定義了一個無參無返回值容器 MyFun
delegate void MyFun();

// 定義了一個返回值為int,有一個int參數的委派容器
delegate int MyFun2(int a);

使用範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
delegate void MyFun();
delegate int MyFun2(int a);
class Program
{
static void Main()
{
Console.WriteLine("委派");

// 裝載method的容器
MyFun f = new MyFun(Fun);
// 呼叫容器裡面的method
f.Invoke();

// 簡化寫法,與f的方式一樣
MyFun f2 = Fun;
f2();

// 容器與委派的method參數必須要對應
MyFunc2 f3 = Fun2;
f3(1);
}

static void Fun()
{
Console.WriteLine("123456");
}

static int Fun2(int value)
{
Console.WriteLine(value);
return value;
}
}

C#預設先定義的委派

  • Action:是一個無參無返回值的委派
  • Func:一個無參數,但有一個返回泛型TResult的委派
  • Action(T obj)可以傳多個參數(最多有16個,是使用overload的方式),無返回的委派
  • Func<in T, out TResult>(T arg); 可以傳多個參數,且有一個返回泛型TResult的委派
  • 記憶方式:Func是有返回值的委託,而Action則是不會返回值的委託

Action例子

1
2
3
4
5
6
7
Action<int, string> action = FunTest;

static void FunTest(int a, string b)
{
// do something...
}

Func例子

1
2
3
4
5
6
7
Func<int, int> func = FunTest2;

static int FunTest2(int value)
{
Console.WriteLine(value);
return value;
}