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

前言

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

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

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

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

委托简述

在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方式。

本文有误地方欢迎指正~

参考链接

简单说说C#中委托的使用-01的更多相关文章

  1. C#中委托和事件

    目 录 将方法作为方法的参数 将方法绑定到委托 更好的封装性 限制类型能力 范例说明 Observer 设计模式简介 实现范例的Observer 设计模式 .NET 框架中的委托与事件 为什么委托定义 ...

  2. c#中委托和事件(转)

    C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 ...

  3. C#中委托的理解

    请注意,这只是个人关于C#中委托的一点点理解,参考了一些博客,如有不周之处,请指出,谢谢! 委托是一种函数指针,委托是方法的抽象,方法是委托的实例.委托是C#语言的一道坎,明白了委托才能算是C#真正入 ...

  4. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

  5. 简单谈谈Python中的几种常见的数据类型

    简单谈谈Python中的几种常见的数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等 ...

  6. C#中委托、匿名函数、Lambda表达式的一些个人理解

    0x01定义一个委托,相当于定义一个可以存储方法的特殊变量类型 下面我们看具体的代码,通过代码更好理解 delegate void IntMethodInvoker(int x); 这行代码就是声明一 ...

  7. .NET中委托性能的演变

    .NET中的委托 .NET中的委托是一项重要功能,可以实现间接方法调用和函数式编程. 自.NET Framework 1.0起,委托在.NET中就支持多播(multicast)功能.通过多播,我们可以 ...

  8. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  9. 简单理解ECMAScript2015中的箭头函数新特性

    箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...

  10. C#中委托和事件的区别实例解析

    这篇文章主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下 本文实例分析了C#中委托和事件的区别,分享给大家 ...

随机推荐

  1. 大数据之路Week10_day01 (Hbase总结 II)

    Hbase是数据库 特点: 1.面向列:Hbase是面向列的存储和权限控制,并支持独立索引.列式存储,其数据在表中是按照某列存储的,这样在查询只需要少数几个字段时,能大大减少读取的数据量. 2.多版本 ...

  2. JSON驱动的vue可视化表单设计器组件

    form-create-designer 是基于 @form-create/element-ui 实现的表单设计器组件.可以通过拖拽的方式快速创建表单,轻松帮你搞定表单. 源码地址: Github | ...

  3. postman 提示Http Status 400 -Bad Request

    Http Status 400 -Bad Request 将headers下面的选项全部勾选 新版postman自带的内容

  4. JS数组相减

    const arr1 = [1, 2, 3] const arr2 = [1, 3] const arr3 = arr1.filter(v => !arr2.includes(v)) // [2 ...

  5. MinIO Linux 数据迁移

    目录 安装 下载 安装Minio客户端 备份数据 数据还原 数据迁移 设置别名 迁移 从A服务器,迁移致B服务器,前提,需要两边的 Bucket 相同,如果B服务器没有A服务器里的 Bucket 需要 ...

  6. CAD通过XCLIP命令插入DWG参照裁剪图形,引用局部图像效果(CAD裁剪任意区域)

    CAD通过XCLIP命令插入DWG参照裁剪图形,实现引用局部图像效果,裁剪任意区域! 1.首先在你要引用局部图的文件内,插入参照! 2. 然后再空白区域指定插入点,输入比例因子,默认输入1,然后缩小视 ...

  7. 对于 emlog pro 目前 avatar 头像不显示的问题,暂时使用这个方法解决

    avatar 头像 cdn 不稳定,目前 emlog 官方还没有放出更新包.因此,现在使用 JS 的方式暂时解决. 代码如下 <script> const avaUrl = 'https: ...

  8. study Rust-4【所有权】这个太重要了!

    由于Rust内存垃圾自动回收,那就得搞清楚这个所有权玩意.这个太重要了.因为关系到贯穿于你以后的程序编写. 几个概念: 一.移动 1.咱们一般语言,自己申请内存,自己管理和释放.就是new和free. ...

  9. 如何使用Nacos作为配置中心统一管理配置

    如何使用Nacos作为配置中心统一管理配置 1).引入依赖, <dependency> <groupId>com.alibaba.cloud</groupId> & ...

  10. Spring Cloud Gateway网关

    一.Spring Cloud Gateway组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求由(路由)转发到对应的微服务 网关的执行过程:当一个请求到达网关,网关利用断言,查看该请求是 ...