简单说说C#中委托的使用-01
<h1 id="简单说说c中委托的使用-01">简单说说C#中委托的使用-01</h1><h2 id="前言">📑前言</h2>
<p>距离上次更新文章,已经过去...月了。</p>
<p>没更新文章的主要原因,主要是因为参加工作后,感觉思维没有上学那会活跃,写文章没有思绪。再就是上班的时候把精力用光了,下班后只顾着打游戏🎮,没有恢复精力和学习📚。</p>
<p>在公司网上冲浪🏄的时候,看到了一篇讲解<code>C#</code>委托的文章,文章中描述委托的使用,选择的例子很不错(链接在文末)。在日常开发中,我写的最多的就是CRUD了,他这篇文章使用的是导出excel的例子。</p>
<p>平时开发中,我也写过excel导出的功能,但是好像并没有用到委托。经过我的详细反复阅读之后,今天这篇文章我就用另外一个例子描述下如何在<code>C#</code>中使用委托。</p>
<h2 id="委托简述">📖委托简述</h2>
<p>在C#中,委托(Delegate)是一种类型,它定义了方法的类型,使得可以将方法作为参数传递或作为返回值。</p>
<h2 id="委托使用">✨委托使用</h2>
<h3 id="例子">例子</h3>
<blockquote>
<p>假设我们有一个订单系统,需要根据不同的促销策略计算订单的最终价格。不同的促销策略可能是:</p>
<ol>
<li>固定折扣(减 10 元)。</li>
<li>百分比折扣(打 8 折)。</li>
<li>满减优惠(满 100 减 20)。</li>
</ol>
<p>我们希望通过委托动态传递这些策略,而不是写死逻辑。</p>
</blockquote>
<h3 id="博主写法">博主写法</h3>
<pre><code class="language-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;
}
</code></pre>
<p><font size="1">太优雅了~</font></p>
<h3 id="委托写法">委托写法</h3>
<h4 id="第一步定义委托类型">第一步:定义委托类型</h4>
<pre><code class="language-C#">// 委托类型:输入订单金额(decimal),返回折扣后的金额(decimal)
public delegate decimal DiscountStrategy(decimal originalPrice);
</code></pre>
<h4 id="第二步实现具体折扣方法">第二步:实现具体折扣方法</h4>
<p>为每种促销策略写一个匹配委托签名的方法:</p>
<pre><code class="language-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;
}
</code></pre>
<h4 id="第三步使用委托传递方法">第三步:使用委托传递方法</h4>
<p>新建订单类,接收外部传入的折扣策略:</p>
<pre><code class="language-c#">public class OrderProcessor
{
// 方法:计算订单最终价格,接收一个委托参数
public decimal ProcessOrder(decimal originalPrice, DiscountStrategy discountStrategy)
{
// 调用委托,自动执行传入的策略方法
return discountStrategy(originalPrice);
}
}
</code></pre>
<h4 id="第四步调用">第四步:调用</h4>
<pre><code class="language-c#">public static void Main()
{
var processor = new OrderProcessor();
// 选择策略
DiscountStrategy currentStrategy = PercentageDiscount;
// 计算价格
decimal finalPrice = processor.ProcessOrder(100, currentStrategy);
Console.WriteLine($"百分比折扣后价格:{finalPrice}");
}
</code></pre>
<h4 id="输出结果">输出结果</h4>
<p><img src="https://img2024.cnblogs.com/blog/3091176/202505/3091176-20250526172250017-1499353730.png" alt="image" loading="lazy"></p>
<h3 id="进阶委托写法">进阶委托写法</h3>
<p>使用 <code>Func/Action</code> 实现委托</p>
<h4 id="第一步使用-funcdecimal-decimal-定义替代delegate委托">第一步:使用 <code>Func<decimal, decimal></code> 定义替代<code>delegate</code>委托</h4>
<pre><code class="language-c#">// 不需要定义 delegate,直接用 Func<输入参数类型, 返回值类型>
public class OrderProcessor
{
// 接收 Func<decimal, decimal> 作为折扣策略
public decimal ProcessOrder(decimal originalPrice, Func<decimal, decimal> discountStrategy)
{
return discountStrategy(originalPrice);
}
}
</code></pre>
<h4 id="第二步无需修改">第二步:无需修改</h4>
<h4 id="第三步调用">第三步:调用</h4>
<pre><code class="language-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}");
}
</code></pre>
<h4 id="输出结果-1">输出结果</h4>
<p><img src="https://img2024.cnblogs.com/blog/3091176/202505/3091176-20250526172304352-213167465.png" alt="image" loading="lazy"></p>
<h2 id="总结">📕总结</h2>
<p>委托适用于任何需要传递方法的地方(如回调、策略模式、事件处理)。</p>
<p>用<strong><code>delegate</code></strong>关键字声明委托,也可以使用<strong><code>Func</code>/<code>Action</code> + Lambda</strong>方式。</p>
<p><em>本文有误地方欢迎指正~</em></p>
<p>🔗参考链接</p>
<ul>
<li>C# 委托 https://www.cnblogs.com/ysmc/p/18800819</li>
<li><code>deepseek</code> https://chat.deepseek.com/</li>
</ul><br><br>
来源:https://www.cnblogs.com/ZYPLJ/p/18897174
頁:
[1]