跳過到頁腳內容
.NET幫助

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

身為使用 IronPDF 動態產生 PDF 的 .NET 開發人員,您經常需要表示和管理一系列特定類型 - 想想不同種類的文件資料、日誌訊息、使用者角色或匯出選項。 這就是 C# 歧義聯的概念發揮作用的地方。

雖然 C# 並不像 F# 或 Rust 般原生支援判別式結合,但您仍可有效模擬判別式結合。 在本篇博文中,我們將深入探討如何在 C# 中定義並使用 discriminated union 類型,示範如何在 IronPDF 中應用它來進行實際的 PDF 處理,並探討此模式所提供的優點 - 尤其是搭配模式匹配時。

What Are Discriminated Unions in C#?

分辨式合一(也稱為標記式合一或合一類型)允許變量從一組有限的可能選項中保留一個值,其中每個選項都與唯一的大小寫識別碼相關聯。

在 F# 等其他語言中,您可能會使用 union 關鍵字來定義它們。 C# 原生不提供此功能,但開發人員可以使用記錄、類別和切換表達式的巧妙組合來模仿它們。

舉例來說

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

此方法可讓您的程式碼井井有條、穩健有力,並讓開發人員更容易在單一位置瞭解所有可能的選項。

Simulating Discriminated Unions in C# - Struct vs. Record vs. Class

雖然 C# 缺乏 union 關鍵字,但您可以使用以下方式模擬判別式的 unions:.NET、Java、Python 或 Node js:

  • 記錄:非常適合不可變的資料,並簡潔地支援模式匹配。
  • 類別:繼承和引用語義更靈活。
  • 結構:對於值類型非常有用,但在處理參考類型或繼承時則較不靈活。

C# Discriminated Unions (How it Works for Developers):圖 1 - Struct vs. Record vs. Class

如果性能和記憶體佈局很重要,例如在高吞吐量的 PDF 記錄中,您可以考慮謹慎使用 struct discriminated unions:

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

注意:使用 structs 會失去一些模式匹配的優點,尤其是依賴 switch 表達式時。

在 C# 中使用判別聯合的好處;

採用這種軟體工程模式有幾個主要優點:

  • 編譯時安全性:您將在運行前捕捉 switch 表達式中遺漏的情況。
  • 更清晰的邏輯:使用已命名的案例更容易撰寫、註解和推理動作。
  • Separation of concerns:您根據 data 而非類型層級來解耦行為。
  • 重構容易度:新增或移除案例變得更直接。

與 IronPDF 搭配使用時,可以更輕鬆地管理使用者輸入、渲染邏輯,或以不同的數值管道建立動態範本。

何時使用 IronPDF 的判別聯合?

以下是此模式的一些實際應用場合:

  • PDF 生成工作流程:文件生命週期中的不同步驟(生成、儲存、電子郵件)。
  • 權限模型:代表不同的使用者存取層級。
  • 記錄系統:對日誌層級 (資訊、錯誤、除錯) 使用區分的聯盟類型。
  • 單元測試:將測試動作定義為可維護邏輯樹的聯盟類型。
  • 輸出選項:將 PDF、Excel、Word 等輸出目標表示為聯合實體。

C# Discriminated Unions (How it Works for Developers):圖表 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# 語言尚未引入真正的聯合關鍵字,但 C# 仍在持續演進,使記錄、模式匹配和切換表達式等功能更接近完整的判別聯合功能。

對現代化、功能友善的語言結構感興趣的 .NET 開發人員,請密切注意此空間。

最後的想法

在 C# 中使用判別聯合,即使沒有本機支援,也能大幅改善 IronPDF 應用程式中的結構和邏輯表示方式。 透過利用記錄、切換表達式和基類,您將可使您的程式碼庫更具可讀性、可維護性和對錯誤的適應力,同時也可解開處理 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 核心代碼的原作者,他自開始以來塑造了公司產品架構,與 CEO Cameron Rimington 一起將其轉變為一家擁有超過 50 名員工的公司,為 NASA、特斯拉 和 全世界政府機構服務。

Jacob 持有曼徹斯特大學土木工程一級榮譽学士工程學位(BEng) (1998-2001)。他於 1999 年在倫敦開設了他的第一家軟件公司,並於 2005 年製作了他的首個 .NET 組件,專注於解決 Microsoft 生態系統內的複雜問題。

他的旗艦產品 IronPDF & Iron Suite .NET 庫在全球 NuGet 被安裝超過 3000 萬次,其基礎代碼繼續為世界各地的開發工具提供動力。擁有 25 年的商業經驗和 41 年的編碼專業知識,Jacob 仍專注於推動企業級 C#、Java 及 Python PDF 技術的創新,同時指導新一代技術領袖。