跳過到頁腳內容
.NET HELP

C# Discriminated Unions (How it Works for Developers)

身為使用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# 中模擬可區分聯合類型—結構體、記錄和類

雖然 C# 沒有 union 關鍵字,但您可以使用以下方法模擬可區分聯合:

*記錄:*非常適合不可變數據,並支援清晰的模式匹配。 類別:**繼承和引用語意更加靈活。 *結構體:對於值類型很有用,但在處理參考類型或繼承時彈性較差。

C# 可區分聯合類型(開發者如何理解):圖 1 - 結構體、記錄和類別

如果效能和記憶體佈局很重要——例如,在高吞吐量 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 產生工作流程:文件生命週期中的不同步驟(產生、儲存、電子郵件)。 *權限模型:*表示不同的使用者存取等級。 日誌系統:使用可區分的聯合類型來表示日誌等級(info、error、debug)。 單元測試:將測試操作定義為聯合類型,以便維護邏輯樹。 匯出選項:**將 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# 中加入可區分聯合類型的原生支持,尤其是在對更具表現力的類型系統的需求日益增長的情況下。 雖然 C# 語言尚未引入真正的 union 關鍵字,但它仍在不斷發展——使記錄、模式匹配和 switch 表達式等功能更接近完全可區分的 union 功能。

對現代、函數式友善的語言結構感興趣的 .NET 開發人員需要密切關注這一領域。

最後想說的話

即使沒有原生支持,在 C# 中使用可區分聯合體也能顯著改善IronPDF應用程式中邏輯的結構和表示方式。 透過利用記錄、switch表達式和基類,您可以讓程式碼庫更易讀、更易於維護、更能抵禦錯誤,同時還能解鎖一種更具聲明性和表現力的方式來處理與PDF相關的任務。

如果你是一名建立現代、靈活的 .NET 應用程式的軟體工程師,那麼這種模式是你工具包中必不可少的。

立即免費試用 IronPDF

準備好將您的 C# PDF 生成技術提升到一個新的水平了嗎? 下載 IronPDF 並開始免費試用。 無論您是從 HTML 產生文件、記錄匯出內容,還是使用區分聯合體自動產生報告,IronPDF 都能為您提供應用程式應有的強大功能和卓越效能。

常見問題解答

如何在 C# 中實現判別聯合?

在 C# 中,您可以透過定義一個基類和數個派生類來代表每種可能的情況,從而模擬判別式合併。此方法結合模式匹配,可讓您有效管理多種相關的資料類型。

模式匹配在判別聯合中的作用是什麼?

C# 中的模式匹配在處理判別聯合時至關重要,因為它可以讓您以簡潔的方式處理聯合的每一種情況,提高程式碼的可讀性,並減少對多重條件語句的需求。

與 C# 中的枚舉相比,判別式單元有什麼不同?

雖然判別式單元和枚舉都允許您定義一組固定的選項,但判別式單元提供了更大的靈活性,因為它們可以容納不同類型的資料,而枚舉則只限於單一資料類型的命名常數。

在使用判別聯合的同時,是否可以使用 Iron Software 加強資料處理?

是的,Iron Software 的產品(如 IronPDF for .NET)可以透過提供先進的資料處理和加工功能來補充辨別式單元,使得在 .NET 應用程式中操作和呈現不同類型的資料變得更容易。

在 C# 中使用判別聯合有哪些優點?

Discriminated unions 透過允許您定義具有特定可能形式的類型,在您的 C# 程式碼中提供增強的類型安全性、清晰度和可維護性,促進健全的類型檢查並減少錯誤。

使用識別聯會如何影響程式碼的可讀性?

透過允許開發人員清楚定義並處理多種相關的資料類型,判別式合併提高了程式碼的可讀性。模式匹配可減少複雜的條件邏輯,進一步簡化程式碼。

在 C# 中使用類別模擬判別聯合的意義何在?

在 C# 中使用類別模擬判別式合併,包括建立一個基類,並針對每種情況建立衍生類別,以彈性且具表達力的方式為不同的相關類型建模,類似於函式程式語言。

判別聯合如何增強 C# 中的錯誤處理?

判別合一可以透過提供更精確的類型檢查和啟用模式匹配來改善錯誤處理,這有助於在編譯時捕捉潛在的錯誤,提高應用程式的可靠性。

Jacob Mellor,技術長 @ Team Iron
首席技術長

Jacob Mellor 是 Iron Software 的首席技術長,也是開創 C# PDF 技術的有遠見的工程師。作為 Iron Software 核心程式碼庫背後的原始開發人員,他從公司成立之初就塑造了公司的產品架構,與首席執行官 Cameron Rimington 一起將公司轉型為一家 50 多人的公司,為 NASA、Tesla 和全球政府機構提供服務。

Jacob 持有曼徹斯特大學土木工程一級榮譽工程學士學位 (BEng)(1998-2001 年)。

Jacob 於 1999 年在倫敦開設了他的第一家軟體公司,並於 2005 年創建了他的第一個 .NET 元件,之後,他專門解決微軟生態系統中的複雜問題。

他的旗艦產品 IronPDF & Iron Suite for .NET 函式庫在全球的 NuGet 安裝量已超過 3000 萬次,他的基礎程式碼持續為全球使用的開發人員工具提供動力。Jacob 擁有 25 年的商業經驗和 41 年的編碼專業知識,他一直專注於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代的技術領導者。