LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

簡單說說C#中委托的適用場景

freeflydom
2025年6月3日 9:27 本文熱度 371

??委托簡述

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


    轉自https://www.cnblogs.com/ZYPLJ/p/18897174


    該文章在 2025/6/3 9:32:18 編輯過
    關鍵字查詢
    相關文章
    正在查詢...
    點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
    點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
    點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
    點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
    Copyright 2010-2025 ClickSun All Rights Reserved

    黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
    日本高清一级婬片A级中文字幕 | 日韩女同中文字幕永久在线 | 亚州另类欧美综合一区 | 日韩欧美精品一本二本道一区 | 亚洲欧美丝袜久久精品 | 亚洲精品大全寸在线看片 |