📖委托简述
在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方式。