跳過到頁腳內容
.NET幫助

C#差異聯合(它如何對開發者起作用)

作為使用IronPDF進行動態PDF生成的.NET開發人員,您經常需要表示和管理一系列特定類型——想到不同種類的文檔數據、日誌消息、用戶角色或導出選項。 這就是C#歧視聯合概念的作用。

雖然C#不像F#或Rust那樣原生支持歧視聯合,但您仍然可以有效地模擬歧視聯合。 在這篇博客文章中,我們將深入探討如何在C#中定義和使用歧視聯合類型,展示如何將其應用於IronPDF進行現實世界的PDF處理,並探討這一模式提供的優勢——特別是在與模式匹配配對時。

C#中的歧視聯合是什麼?

歧視聯合,也稱為標記聯合或聯合類型,允許一個變量從一組有限的可能選項中保存一個值,其中每個選項都與一個唯一的案例標識符相關聯。

在F#等其他語言中,您可以使用union關鍵字來定義它們。 C#本身不提供這一功能,但開發人員可以使用記錄、類和switch表達式的巧妙組合來模擬它們。

例如:

public abstract record PdfAction;
public record GenerateReport(string ReportName) : PdfAction;
public record LogError(string Message) : PdfAction;
public record ExportToExcel(string FilePath) : PdfAction;
public abstract record PdfAction;
public record GenerateReport(string ReportName) : PdfAction;
public record LogError(string Message) : PdfAction;
public record ExportToExcel(string FilePath) : PdfAction;
Public MustOverride ReadOnly Property PdfAction() As record
public record GenerateReport(String ReportName) : PdfAction
public record LogError(String Message) : PdfAction
public record ExportToExcel(String FilePath) : PdfAction
$vbLabelText   $csharpLabel

上述每個記錄都代表該聯合的一個案例。 基礎PdfAction類型是判別式。

為什麼歧視聯合在IronPDF工作流程中很重要

想像一下您正在使用IronPDF構建PDF報告生成器,您需要根據用戶的輸入執行不同的操作——可能是生成PDF、記錄錯誤或導出數據。

在C#中使用歧視聯合可以讓您乾淨地表示這些選項類型,從而實現編譯時安全性,減少錯誤,並提供更清晰的邏輯。

以下是如何在IronPDF中使用它的示例:

void HandlePdfAction(PdfAction action)
{
    switch (action)
    {
        case GenerateReport r:
            var pdf = new IronPdf.HtmlToPdf().RenderHtmlAsPdf("<h1>" + r.ReportName + "</h1>");
            pdf.SaveAs(r.ReportName + ".pdf");
            break;
        case LogError e:
            Console.WriteLine("Logging Error: " + e.Message);
            break;
        case ExportToExcel x:
            Console.WriteLine("Exporting to Excel at " + x.FilePath);
            break;
        default:
            throw new NotSupportedException("Unknown action");
    }
}
void HandlePdfAction(PdfAction action)
{
    switch (action)
    {
        case GenerateReport r:
            var pdf = new IronPdf.HtmlToPdf().RenderHtmlAsPdf("<h1>" + r.ReportName + "</h1>");
            pdf.SaveAs(r.ReportName + ".pdf");
            break;
        case LogError e:
            Console.WriteLine("Logging Error: " + e.Message);
            break;
        case ExportToExcel x:
            Console.WriteLine("Exporting to Excel at " + x.FilePath);
            break;
        default:
            throw new NotSupportedException("Unknown action");
    }
}
Private Sub HandlePdfAction(ByVal action As PdfAction)
	Select Case action
'INSTANT VB TODO TASK: The following 'case' pattern variable is not converted by Instant VB:
'ORIGINAL LINE: case GenerateReport r:
		Case GenerateReport r
			Dim pdf = (New IronPdf.HtmlToPdf()).RenderHtmlAsPdf("<h1>" & r.ReportName & "</h1>")
			pdf.SaveAs(r.ReportName & ".pdf")
'INSTANT VB TODO TASK: The following 'case' pattern variable is not converted by Instant VB:
'ORIGINAL LINE: case LogError e:
		Case LogError e
			Console.WriteLine("Logging Error: " & e.Message)
'INSTANT VB TODO TASK: The following 'case' pattern variable is not converted by Instant VB:
'ORIGINAL LINE: case ExportToExcel x:
		Case ExportToExcel x
			Console.WriteLine("Exporting to Excel at " & x.FilePath)
		Case Else
			Throw New NotSupportedException("Unknown action")
	End Select
End Sub
$vbLabelText   $csharpLabel

這種方法使您的代碼組織得更加有序和健壯,並使開發人員更容易在一個位置理解所有可能的選項。

在C#中模擬歧視聯合——結構體vs.記錄vs.類

儘管C#缺乏union關鍵字,但您可以使用以下方法模擬歧視聯合:

  • 記錄:適用於不可變數據,並支持乾淨的模式匹配。
  • :在繼承和引用語義方面更靈活。
  • 結構體:對於值類型有用,但在處理引用類型或繼承時靈活性較小。

C#歧視聯合(對於開發人員的工作方式):圖1 - 結構體vs.記錄vs.類

如果性能和內存佈局很重要——例如,在高吞吐量PDF日誌中,您可能需要謹慎地使用結構體歧視聯合:

public interface IAction { }
public readonly struct SaveAction : IAction
{
    public string FileName { get; }
    public SaveAction(string fileName) => FileName = fileName;
}
public interface IAction { }
public readonly struct SaveAction : IAction
{
    public string FileName { get; }
    public SaveAction(string fileName) => FileName = fileName;
}
Public Interface IAction
End Interface
'INSTANT VB WARNING: VB has no equivalent to the C# readonly struct:
'ORIGINAL LINE: public readonly struct SaveAction : IAction
Public Structure SaveAction
	Implements IAction

	Public ReadOnly Property FileName() As String
	Public Sub New(ByVal fileName As String)
		Me.FileName = fileName
	End Sub
End Structure
$vbLabelText   $csharpLabel

注意:您將失去一些使用結構體的模式匹配優勢,特別是在依賴於switch表達式時。

在C#中使用歧視聯合的好處

採用這種軟件工程模式有幾個關鍵優勢:

  • 編譯時安全性:您將在運行時之前在switch表達式中捕捉到缺少的情況。
  • 更清晰的邏輯:使用命名案例更容易撰寫、註釋和推理行動。
  • 關注點分離:您可以根據數據而非類型層次結構解耦行為。
  • 重構簡單性:添加或移除案例變得更簡單。

在與IronPDF配對時,這使得管理用戶輸入、渲染邏輯或創建具有不同值流水線的動態模板更加容易。

何時與IronPDF一起使用歧視聯合

下面是這種模式在某些實際情況下的特別適用場景:

  • PDF生成工作流程:文檔生命周期中的不同步驟(生成、保存、發送電子郵件)。
  • 權限模型:表示不同的用戶訪問級別。
  • 日誌系統:使用歧視聯合類型表示日誌級別(信息、錯誤、調試)。
  • 單元測試:將測試操作定義為聯合類型,以實現可維護的邏輯樹。
  • 導出選項:將輸出目標(如PDF、Excel、Word)表示為聯合實例。

C#歧視聯合(對於開發人員的工作方式):圖2 - 在.NET應用中歧視聯合的常見場景

示例——從UI事件處理PDF操作

假設您正在捕獲UI事件,並希望將它們路由到使用歧視聯合的IronPDF任務:

public abstract record UserAction;
public record GeneratePdf(string HtmlContent, string FileName) : UserAction;
public record ShowMessage(string Text) : UserAction;
public record ExitApplication() : UserAction;
void OnUserEvent(UserAction action)
{
    switch (action)
    {
        case GeneratePdf pdf:
            var renderer = new IronPdf.HtmlToPdf();
            var document = renderer.RenderHtmlAsPdf(pdf.HtmlContent);
            document.SaveAs(pdf.FileName);
            break;
        case ShowMessage msg:
            MessageBox.Show(msg.Text);
            break;
        case ExitApplication:
            Application.Exit();
            break;
    }
}
public abstract record UserAction;
public record GeneratePdf(string HtmlContent, string FileName) : UserAction;
public record ShowMessage(string Text) : UserAction;
public record ExitApplication() : UserAction;
void OnUserEvent(UserAction action)
{
    switch (action)
    {
        case GeneratePdf pdf:
            var renderer = new IronPdf.HtmlToPdf();
            var document = renderer.RenderHtmlAsPdf(pdf.HtmlContent);
            document.SaveAs(pdf.FileName);
            break;
        case ShowMessage msg:
            MessageBox.Show(msg.Text);
            break;
        case ExitApplication:
            Application.Exit();
            break;
    }
}
Public MustOverride ReadOnly Property UserAction() As record
public record GeneratePdf(String HtmlContent, String FileName) : UserAction
public record ShowMessage(String Text) : UserAction
public record ExitApplication() : UserAction
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'void OnUserEvent(UserAction action)
'{
'	switch (action)
'	{
'		case GeneratePdf pdf:
'			var renderer = New IronPdf.HtmlToPdf();
'			var document = renderer.RenderHtmlAsPdf(pdf.HtmlContent);
'			document.SaveAs(pdf.FileName);
'			break;
'		case ShowMessage msg:
'			MessageBox.Show(msg.Text);
'			break;
'		case ExitApplication:
'			Application.@Exit();
'			break;
'	}
'}
$vbLabelText   $csharpLabel

這讓您可以用清晰的邏輯表示事件,並減少對公共對象類型或過度動態處理的依賴。

未來展望——C#是否會支持原生歧視聯合?

已經有一個提案要求在C#中添加原生的歧視聯合支持,特別是在對更具表達力的類型系統的需求增長的情況下。 雖然該語言尚未引入真正的union關鍵字,但C#不斷發展——帶來了記錄、模式匹配和switch表達式等功能,逐步趨向完全的歧視聯合功能。

對現代、友好於功能性的語言構造感興趣的.NET開發人員將需要密切關注這一領域。

最後的想法

即使沒有原生支持,在C#中使用歧視聯合可以顯著改善您在IronPDF應用程序中如何構建和表達邏輯。 通過利用記錄、switch表達式和基礎類,您將使您的代碼庫更具可讀性、可維護性並減少錯誤——同時也解鎖了一種更具宣告性和表達力的方式來處理與PDF相關的任務。

如果您是正在構建現代、靈活的.NET應用程序的軟件工程師,這種模式是您工具包中的必備品。

今天就試用IronPDF

準備好將您的C# PDF生成提升到一個新的高度? 下載IronPDF並開始免費試用。 無論您是在從HTML生成文檔、記錄導出還是使用歧視聯合自動化報告——IronPDF為您的應用程序提供應有的能力和性能。

常見問題解答

如何在 C# 中实现歧视联合?

在 C# 中,您可以通过定义基类和几个派生类来表示每个可能的情况,从而模拟歧视联合。这种方法结合模式匹配,使您能够有效地管理多个相关的数据类型。

模式匹配在歧视联合中的作用是什么?

C# 中的模式匹配在处理歧视联合时至关重要,因为它使您能够以简洁的方式处理联合的每种情况,改善代码可读性并减少多个条件语句的需求。

歧视联合与 C# 中的枚举如何比较?

虽然歧视联合和枚举都允许您定义一组固定的选项,但歧视联合提供了更多的灵活性,因为它们可以包含不同类型的数据,而枚举仅限于单一数据类型的命名常量。

在使用歧视联合时,我能否增强数据操作与 Iron Software?

是的,Iron Software 产品如 IronPDF 可以通过提供高级的数据处理和操作功能来补充歧视联合,使在 .NET 应用程序中更容易操作和展示不同类型的数据。

在 C# 中使用歧视联合的好处是什么?

歧视联合通过允许您定义具有特定可能形式的类型,从而在您的 C# 代码中提供增强的类型安全性、清晰度和可维护性,促进健壮的类型检查和减少错误。

使用歧视联合会如何影响代码的可读性?

通过允许开发人员清晰地定义和处理多个相关数据类型,歧视联合改善了代码可读性。模式匹配进一步简化代码,通过减少复杂条件逻辑的需求。

使用类来模拟歧视联合在 C# 中的意义是什么?

在 C# 中使用类来模拟歧视联合涉及到创建一个基类并为每个情况创建衍生类,这提供了一种灵活且富有表现力的方式来模拟不同的相关类型,类似于函数式编程语言。

歧视联合如何增强 C# 中的错误处理?

歧视联合通过提供更精确的类型检查和启用模式匹配,可以在编译时捕获潜在的错误,从而提升应用程序的可靠性,提高错误处理能力。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。