简单说说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#中委托和事件的区别,分享给大家 ...
随机推荐
- 赞美Syscall
知道程序员在编写程序时直接和硬件打交道是一件非常麻烦的事,同时不受保障的程序直接运行在硬件上如果出错可能造成计算机宕机,于是可以编写一个应用程序驻留在计算机上管理硬件资源为上层应用提供系统调用(sys ...
- 『Plotly实战指南』--折线图绘制进阶篇
上一篇介绍了Plotly绘制折线图的基础知识和数据预处理的技巧, 本文将重点探讨如何利用Plotly实现多线折线图的布局设计以及动态折线图的实现, 让我们一起掌握进阶的折线图绘制技巧. 1. 多折线图 ...
- breach1靶机渗透学习
靶机下载 https://www.vulnhub.com/ 找Breach-1.0,不过这个是老靶机了,可以看网上其他博客附带有靶机下载的网盘链接,靶机官网访问很慢而且网站好像出问题了排版很乱,不打也 ...
- Netty源码—4.客户端接入流程
大纲 1.关于Netty客户端连接接入问题整理 2.Reactor线程模型和服务端启动流程 3.Netty新连接接入的整体处理逻辑 4.新连接接入之检测新连接 5.新连接接入之创建NioSocketC ...
- Windows 提权-手工枚举
本文通过 Google 翻译 Manual Enumeration – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别 ...
- final关键字、Object类--java进阶day01
1.规则 被final修饰的变量,名称都要大写,多单词的名称则需_来分隔 1.修饰方法 method方法已经不能被重写了,因为修饰该方法的是final 2.修饰类 当一个类中所有的成员方法都不想被重写 ...
- 【Java】TCP套接字编程
服务器 server.java package socket; import java.io.*; import java.net.*; public class server { public st ...
- Win10微软拼音输入法设置-注册表
修改候选项窗口 HKEY_CURRENT_USER\Software\Microsoft\InputMethod\CandidateWindow\CHS\1 EnableFixedCandidateC ...
- 【Yuexingfei_qwq的原创游戏】
好的其实标题里的Yuexingfei_qwq指的是我. 不定时持续更新ing-- 有bug及时回复或私信我哈-- 本文同步发表在以下Blog: 洛谷:https://www.luogu.com.cn/ ...
- svelte+vite+ts+melt-ui从0到1完整框架搭建
框架太"重"了:通常一个小型项目只由少数几个简单页面构成,如果使用 Vue 或者 React 这些框架来研发的话,有点"大材小用"了.构建的产物中包含了不少框架 ...