委托 是 <事件/回調(diào)函數(shù)> 的基礎(chǔ)
1.最簡單的委托

image.png
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate
{
delegate int NumberChanger(int num);
class Program
{
static int num = 1;
static void Main(string[] args)
{
NumberChanger nm = new NumberChanger(AddNum);
int a = nm(5);
Console.WriteLine(a);
nm = new NumberChanger(DecNum);
a = nm(5);
Console.WriteLine(a);
Console.ReadLine();
}
public static int AddNum(int p)
{
num += p;
return num;
}
public static int DecNum(int p)
{
num -= p;
return num;
}
}
}
2.multicasting delegate
有一個委托列表,按順序執(zhí)行,可以加減
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate
{
// Muti-casting delegate
delegate void D(int x);
class Program
{
static void Main(string[] args)
{
D fc1 = new D(C.FUNC1);
fc1(111);
D fc2 = new D(C.FUNC2);
fc2(222);
D fc3 = fc1 + fc2;
fc3(333);
Console.ReadLine();
}
}
class C
{
public static void FUNC1(int i)
{
Console.WriteLine("Func1: " + i);
}
public static void FUNC2(int i)
{
Console.WriteLine("Func2: " + i);
}
public void FUNC3(int i)
{
Console.WriteLine("Func3: " + i);
}
}
}
3.上述簡易寫法,直接 += 函數(shù)名

image.png
4.事件event
事件是一個修飾符,用來修飾Delegate實例,目的是讓這個實例只能在聲明該實例的類的內(nèi)部觸發(fā)
見下圖:

image.png

image.png

image.png

image.png
5.回調(diào)函數(shù)
回調(diào)函數(shù),其實就是通過代理,傳遞相同格式的函數(shù)指針,看了一個例子可以實現(xiàn)一種簡單的適配器模式。

image.png
6.Action(無返回值格式代理簡化版)/Func(有返回值格式代理簡化版)
例:(Ps:Func泛型列表最后一個為返回值類型)
相對于直接調(diào)用委托,我更喜歡 .Invoke()方式,這讓我能明確知道這是個委托

image.png
7.事件參數(shù),通過lambda表達式,傳遞到監(jiān)聽者

image.png

image.png