定義
委托:是一個類,它定義了方法簽名(返回類型和方法參數(shù)),能夠獲取匹配它方法簽名的任何方法的引用,本質(zhì)是一個類型安全的函數(shù)指針
事件:是類成員(可以當成一個字段),是委托的封裝
定義語法如下:
public delegate void MyDelegate(string message);
public event MyDelegate MyEvent;
| 為什么需要委托
解決“方法作為參數(shù)的需求”(回調(diào)機制)
解耦調(diào)用方和被調(diào)用方,不再依賴具體方法名
支持事件驅(qū)動編程(為事件奠基)
啟用函數(shù)式編程范式(高階函數(shù))
簡化異步和并發(fā)編程
舉例場景
根據(jù)用戶輸入*,-,*,/實現(xiàn)一個計算方法
public int Calcute(string type,int x,int y)
{
int res = 0;
switch (type)
{
case "+":
res = Add(x, y);
break;
case "-":
res = Sub(x, y);
break;
case "*":
res = Mul(x, y);
break;
case "/":
res = Div(x, y);
break;
default:
break;
}
return res;
}
public int Add(int x,int y)
{
return x + y;
}
public int Sub(int x ,int y)
{
return x - y;
}
public int Mul(int x ,int y)
{
return x * y;
}
public int Div(int x,int y)
{
return x / y;
}
public delegate int CalculDelegate(int x, int y);
public int CalcaulByDelegate(int x,int y,CalculDelegate calculDelegate)
{
int res = 0;
if (calculDelegate != null)
{
res=calculDelegate(x, y);
}
return res;
}
public int CalcuteTest(string type, int x, int y)
{
int res = 0;
switch (type)
{
case "+":
res = CalcaulByDelegate(x,y,(a,b)=>a+b);
break;
case "-":
res = CalcaulByDelegate(x, y, (a, b) => a - b);
break;
case "*":
res = CalcaulByDelegate(x, y, (a, b) => a * b);
break;
case "/":
res = CalcaulByDelegate(x, y, (a, b) => a / b);
break;
default:
break;
}
return res;
}
通過使用事件,實現(xiàn)動態(tài)插入自定義方法,代碼靈活性、復用性更高
| 為什么使用事件
實現(xiàn)安全的發(fā)布——訂閱的通知機制,事件只能做訂閱和取消訂閱操作且不會干擾其他訂閱者。而任何的委托擁有者都可以覆蓋和移除委托方法,會對其他委托擁有者造成干擾,是不安全的。
| 常用泛型委托
無返回類型的泛型委托Action
最多包含16個參數(shù)
Action printHello = () => Console.WriteLine("Hello");
printHello();
Action<string> printMessage = msg => Console.WriteLine(msg);
printMessage("泛型委托示例");
有返回值類型的泛型委托Func
最多包含16個參數(shù)
Func<int, string> intToString = num => num.ToString();
string result = intToString(42);
Func<int, int, bool> isEqual = (a, b) => a == b;
bool check = isEqual(10, 10);
| 實際應(yīng)用場景
集合操作
List<int> data = new List<int> { 1, 2, 3 };
var squared = data.ConvertAll(x => x * x);
2.回調(diào)方法
void ProcessData<T>(T data, Action<T> callback) {
callback(data);
}
ProcessData(42, result => Console.WriteLine($"結(jié)果: {result}"));
3.事件處理
public event Action<string> LogEvent;
LogEvent?.Invoke("事件已觸發(fā)");
| 小結(jié)
泛型委托(如 Action
、Func
)是 C# 中實現(xiàn)回調(diào)、事件處理和 LINQ 的核心機制。它們通過泛型提供類型安全和靈活性,顯著提升代碼的可維護性和復用性。掌握泛型委托能有效簡化復雜邏輯的設(shè)計。
閱讀原文:原文鏈接
該文章在 2025/10/20 10:24:30 編輯過