简单说说C#中委托的使用-01
简单说说C#中委托的使用-01
前言
距离上次更新文章,已经过去...月了。
没更新文章的主要原因,主要是因为参加工作后,感觉思维没有上学那会活跃,写文章没有思绪。再就是上班的时候把精力用光了,下班后只顾着打游戏,没有恢复精力和学习。
在公司网上冲浪的时候,看到了一篇讲解C#委托的文章,文章中描述委托的使用,选择的例子很不错(链接在文末)。在日常开发中,我写的最多的就是CRUD了,他这篇文章使用的是导出excel的例子。
平时开发中,我也写过excel导出的功能,但是好像并没有用到委托。经过我的详细反复阅读之后,今天这篇文章我就用另外一个例子描述下如何在C#中使用委托。
委托简述
在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方式。
本文有误地方欢迎指正~
参考链接
简单说说C#中委托的使用-01的更多相关文章
- C#中委托和事件
目 录 将方法作为方法的参数 将方法绑定到委托 更好的封装性 限制类型能力 范例说明 Observer 设计模式简介 实现范例的Observer 设计模式 .NET 框架中的委托与事件 为什么委托定义 ...
- c#中委托和事件(转)
C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 ...
- C#中委托的理解
请注意,这只是个人关于C#中委托的一点点理解,参考了一些博客,如有不周之处,请指出,谢谢! 委托是一种函数指针,委托是方法的抽象,方法是委托的实例.委托是C#语言的一道坎,明白了委托才能算是C#真正入 ...
- C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路
C#不用union,而是有更好的方式实现 用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...
- 简单谈谈Python中的几种常见的数据类型
简单谈谈Python中的几种常见的数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等 ...
- C#中委托、匿名函数、Lambda表达式的一些个人理解
0x01定义一个委托,相当于定义一个可以存储方法的特殊变量类型 下面我们看具体的代码,通过代码更好理解 delegate void IntMethodInvoker(int x); 这行代码就是声明一 ...
- .NET中委托性能的演变
.NET中的委托 .NET中的委托是一项重要功能,可以实现间接方法调用和函数式编程. 自.NET Framework 1.0起,委托在.NET中就支持多播(multicast)功能.通过多播,我们可以 ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- 简单理解ECMAScript2015中的箭头函数新特性
箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...
- C#中委托和事件的区别实例解析
这篇文章主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下 本文实例分析了C#中委托和事件的区别,分享给大家 ...
随机推荐
- deepseek:以php为例,获取令牌后下一步处理步骤
在 PHP 中,获取到 Bearer Token 后,下一步通常是验证令牌的有效性,并根据令牌中的信息处理请求.以下是详细的步骤和代码示例: 1. 获取 Authorization 头中的令牌 首先, ...
- Easyexcel(5-自定义列宽)
注解 @ColumnWidth @Data public class WidthAndHeightData { @ExcelProperty("字符串标题") private St ...
- VNCTF2025_Crypto
VNCTF2025_Crypto Simple prediction task.py from random import shuffle from Crypto.Util.number import ...
- 魔方求解器程序(层先法,java版本)
实现了一个三阶魔方的层先法求解程序:https://github.com/davelet/java-puzzle-resolver 欢迎试用. 用法 1. 随机试用 不关注起始状态的话可以用程序的随机 ...
- 程序员必看 Linux 常用命令(重要)
文件操作命令 find find 用于在指定目录下查找文件或子目录,如果不指定查找目录,则在当前目录下查找 命令格式:find path -option [-print] [ -exec/-ok co ...
- Centos安装完成后,ifconfig:command not found
1.问题:在刚最小安装完centos7,想查看本机IP地址.然后运行ifconfig,结果弹出报错. 2.问题排查:首先我们了解是不是没有开启网卡导致的?我们可以通过一下3种方法来排查: 1)通过pi ...
- JOKER 前端框架:自带云端可视化 IDE 的创新利器
一.框架概述 在当今前端开发的多元化领域中,JOKER 前端框架犹如一颗璀璨的明星,以其独特而强大的功能,为开发者开辟了一条高效.便捷的创新之路. JOKER 不仅仅是一个普通的框架,它更是一个综合性 ...
- pandas -- 处理非数值型数据 -- 数据分析三剑客(核心)
博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...
- 【电脑】重装Win10之后无法唤醒和正常关机(Y9000P 2022)
问题: Y9000P 2022 改Windows10后经常关机关不全(自带键盘灯亮,电源指示灯不灭),这还不是最重要的,它一会儿不用到时间自动休眠后还经常唤醒不了 解决: 两个问题,总结一下: 一.关 ...
- Oracle PLSQL 存储过程无法进入单步调试
使用PLSQL工具调试存储过程的时候,不管你怎么设置断点,当你点击测试的时候就瞬间执行而过你无法进入单步调试 解决办法: