简单说说C#中委托的使用-01

简单说说C#中委托的使用-01

📑前言

距离上次更新文章,已经过去...月了。

没更新文章的主要原因,主要是因为参加工作后,感觉思维没有上学那会活跃,写文章没有思绪。再就是上班的时候把精力用光了,下班后只顾着打游戏🎮,没有恢复精力和学习📚。

在公司网上冲浪🏄的时候,看到了一篇讲解C#委托的文章,文章中描述委托的使用,选择的例子很不错(链接在文末)。在日常开发中,我写的最多的就是CRUD了,他这篇文章使用的是导出excel的例子。

平时开发中,我也写过excel导出的功能,但是好像并没有用到委托。经过我的详细反复阅读之后,今天这篇文章我就用另外一个例子描述下如何在C#中使用委托。

📖委托简述

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

✨委托使用

例子

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

  1. 固定折扣(减 10 元)。
  2. 百分比折扣(打 8 折)。
  3. 满减优惠(满 100 减 20)。

我们希望通过委托动态传递这些策略,而不是写死逻辑。

博主写法

c# 复制代码
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;
}

太优雅了~

委托写法

第一步:定义委托类型

C# 复制代码
// 委托类型:输入订单金额(decimal),返回折扣后的金额(decimal)
public delegate decimal DiscountStrategy(decimal originalPrice);

第二步:实现具体折扣方法

为每种促销策略写一个匹配委托签名的方法:

c# 复制代码
// 固定折扣(减 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;
}

第三步:使用委托传递方法

新建订单类,接收外部传入的折扣策略:

c# 复制代码
public class OrderProcessor
{
    // 方法:计算订单最终价格,接收一个委托参数
    public decimal ProcessOrder(decimal originalPrice, DiscountStrategy discountStrategy)
    {
        // 调用委托,自动执行传入的策略方法
        return discountStrategy(originalPrice);
    }
}

第四步:调用

c# 复制代码
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委托

c# 复制代码
// 不需要定义 delegate,直接用 Func<输入参数类型, 返回值类型>
public class OrderProcessor
{
    // 接收 Func<decimal, decimal> 作为折扣策略
    public decimal ProcessOrder(decimal originalPrice, Func<decimal, decimal> discountStrategy)
    {
        return discountStrategy(originalPrice);
    }
}

第二步:无需修改

第三步:调用

C# 复制代码
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**方式。

本文有误地方欢迎指正~

🔗参考链接

相关推荐
bianguanyue5 小时前
SQLite密码修改故障排查:RSA加密随机性导致的数据库匹配问题
数据库·sqlite·c#
R-sz5 小时前
导出word并且插入图片
开发语言·c#·word
CodeCraft Studio9 小时前
PPT处理控件Aspose.Slides教程:使用 C# 将 PPTX 转换为 EMF
c#·powerpoint·ppt·aspose·ppt格式转换
future141210 小时前
游戏开发日记7.12
数据结构·学习·c#·游戏开发
洁辉11 小时前
C# & .NET 面试深度复习指南
面试·c#·.net
ChaITSimpleLove11 小时前
.NET9 实现对象深拷贝和浅拷贝的性能测试
.net·性能测试·浅拷贝·深拷贝·deep copy·shallow copy
cui_win11 小时前
【网络】Linux 内核优化实战 - net.netfilter.nf_conntrack_buckets
linux·网络·.net
cui_win11 小时前
【网络】Linux 内核优化实战 - net.netfilter.nf_conntrack_tcp_timeout_established
linux·网络·.net
喵叔哟11 小时前
27.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(一)
微服务·架构·.net
_oP_i13 小时前
无法找到来自源 EdgeWebView,实际安装了,偶尔出现
c#