??委托簡(jiǎn)述
在C#中,委托(Delegate)是一種類(lèi)型,它定義了方法的類(lèi)型,使得可以將方法作為參數(shù)傳遞或作為返回值。
?委托使用
例子
假設(shè)我們有一個(gè)訂單系統(tǒng),需要根據(jù)不同的促銷(xiāo)策略計(jì)算訂單的最終價(jià)格。不同的促銷(xiāo)策略可能是:
固定折扣(減 10 元)。
百分比折扣(打 8 折)。
滿(mǎn)減優(yōu)惠(滿(mǎn) 100 減 20)。
我們希望通過(guò)委托動(dòng)態(tài)傳遞這些策略,而不是寫(xiě)死邏輯。
博主寫(xiě)法
public static void Main()
{
// 假設(shè)訂單的原價(jià)為 100 元
decimal price = 100;
// 假設(shè)促銷(xiāo)類(lèi)型為 "Fixed"
string type = "Fixed";
// 計(jì)算訂單的最終價(jià)格
decimal finalPrice = ProcessOrder(price, type);
// 輸出最終價(jià)格
Console.WriteLine("Final price: " + finalPrice);
}
private static decimal ProcessOrder(decimal price, string type)
{
if (type == "Fixed")
return price - 10;
else if (type == "Percentage")
return price * 0.8m;
else
return price;
}
太優(yōu)雅了~
委托寫(xiě)法
第一步:定義委托類(lèi)型
// 委托類(lèi)型:輸入訂單金額(decimal),返回折扣后的金額(decimal)
public delegate decimal DiscountStrategy(decimal originalPrice);
第二步:實(shí)現(xiàn)具體折扣方法
為每種促銷(xiāo)策略寫(xiě)一個(gè)匹配委托簽名的方法:
// 固定折扣(減 10 元)
public static decimal FixedDiscount(decimal originalPrice)
{
return originalPrice - 10;
}
// 百分比折扣(打 8 折)
public static decimal PercentageDiscount(decimal originalPrice)
{
return originalPrice * 0.8m;
}
// 滿(mǎn)減優(yōu)惠(滿(mǎn) 100 減 20)
public static decimal ThresholdDiscount(decimal originalPrice)
{
if (originalPrice >= 100)
{
return originalPrice - 20;
}
return originalPrice;
}
第三步:使用委托傳遞方法
新建訂單類(lèi),接收外部傳入的折扣策略:
public class OrderProcessor
{
// 方法:計(jì)算訂單最終價(jià)格,接收一個(gè)委托參數(shù)
public decimal ProcessOrder(decimal originalPrice, DiscountStrategy discountStrategy)
{
// 調(diào)用委托,自動(dòng)執(zhí)行傳入的策略方法
return discountStrategy(originalPrice);
}
}
第四步:調(diào)用
public static void Main()
{
var processor = new OrderProcessor();
// 選擇策略
DiscountStrategy currentStrategy = PercentageDiscount;
// 計(jì)算價(jià)格
decimal finalPrice = processor.ProcessOrder(100, currentStrategy);
Console.WriteLine($"百分比折扣后價(jià)格:{finalPrice}");
}
輸出結(jié)果
進(jìn)階委托寫(xiě)法
使用 Func/Action
實(shí)現(xiàn)委托
第一步:使用 Func<decimal, decimal>
定義替代delegate
委托
// 不需要定義 delegate,直接用 Func<輸入?yún)?shù)類(lèi)型, 返回值類(lèi)型>
public class OrderProcessor
{
// 接收 Func<decimal, decimal> 作為折扣策略
public decimal ProcessOrder(decimal originalPrice, Func<decimal, decimal> discountStrategy)
{
return discountStrategy(originalPrice);
}
}
第二步:無(wú)需修改
?第三步:調(diào)用
public static void Main()
{
var processor = new OrderProcessor();
// 方式 1:直接傳入具名方法
decimal price1 = processor.ProcessOrder(50, FixedDiscount);
// 方式 2:用 Lambda 表達(dá)式
decimal price2 = processor.ProcessOrder(100, price => price * 0.5m);
Console.WriteLine($"價(jià)格 1:{price1}");
Console.WriteLine($"價(jià)格 2:{price2}");
}
輸出結(jié)果

??總結(jié)
委托適用于任何需要傳遞方法的地方(如回調(diào)、策略模式、事件處理)。
用delegate
關(guān)鍵字聲明委托,也可以使用Func
/Action
+ Lambda方式。