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

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