LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

简单说说C#中委托的适用场景

freeflydom
2025年6月3日 9:27 本文热度 388

📖委托简述

在C#中,委托(Delegate)是一种类型,它定义了方法的类型,使得可以将方法作为参数传递或作为返回值。

✨委托使用

例子

假设我们有一个订单系统,需要根据不同的促销策略计算订单的最终价格。不同的促销策略可能是:

  1. 固定折扣(减 10 元)。

  2. 百分比折扣(打 8 折)。

  3. 满减优惠(满 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方式。


    转自https://www.cnblogs.com/ZYPLJ/p/18897174


    该文章在 2025/6/3 9:32:18 编辑过
    关键字查询
    相关文章
    正在查询...
    点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
    点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
    点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
    点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
    Copyright 2010-2025 ClickSun All Rights Reserved