C#差異聯合(它如何對開發者起作用)
身為使用 IronPDF 動態產生 PDF 的 .NET 開發人員,您經常需要表示和管理一系列特定類型 - 想想不同種類的文件資料、日誌訊息、使用者角色或匯出選項。 這就是 C# 歧義聯的概念發揮作用的地方。
雖然 C# 並不像 F# 或 Rust 般原生支援判別式結合,但您仍可有效模擬判別式結合。 在本篇博文中,我們將深入探討如何在 C# 中定義並使用 discriminated union 類型,示範如何在 IronPDF 中應用它來進行實際的 PDF 處理,並探討此模式所提供的優點 - 尤其是搭配模式匹配時。
C# 中的判別聯合是什麼?
分辨式合一(也稱為標記式合一或合一類型)允許變量從一組有限的可能選項中保留一個值,其中每個選項都與唯一的大小寫識別碼相關聯。
在 F# 等其他語言中,您可能會使用 union 關鍵字來定義它們。 C# 原生不提供此功能,但開發人員可以使用 record、類別和切換表達式的巧妙組合來模仿它們。
舉例來說
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
上面的每個 record 都代表一個單一的結合案例。 以基本的 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
此方法可讓您的程式碼井井有條、穩健有力,並讓開發人員更容易在單一位置瞭解所有可能的選項。
在 C# 中模擬判別聯合 — Struct 對比 Record 對比 Class
雖然 C# 缺乏 union 關鍵字,但您可以使用以下方式模擬判別式的 unions:.NET、Java、Python 或 Node js:
*record:*非常適合不可變數據,並支援清晰的模式匹配。 類別:**繼承和引用語意更加靈活。 *結構體:對於值類型很有用,但在處理參考類型或繼承時彈性較差。

如果性能和記憶體佈局很重要,例如在高吞吐量的 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
注意:使用 structs 會失去一些模式匹配的優點,尤其是依賴 switch 表達式時。
在 C# 中使用判別聯合的優點
採用這種軟體工程模式有幾個主要優點:
*編譯時安全性:*在執行時間之前,您將捕獲 switch 表達式中缺少的情況。 更清晰的邏輯:使用命名案例更容易編寫、註釋和推理操作。 關注點分離:根據資料而不是類型層次結構來解耦行為。 重構的便捷性:**新增或刪除用例變得更加直接。
與 IronPDF 搭配使用時,可以更輕鬆地管理使用者輸入、渲染邏輯,或以不同的數值管道建立動態範本。
何時使用 IronPDF 的判別聯合?
以下是此模式的一些實際應用場合:
- PDF 產生工作流程:文件生命週期中的不同步驟(產生、儲存、電子郵件)。 *權限模型:*表示不同的使用者存取等級。 日誌系統:使用可區分的聯合類型來表示日誌等級(info、error、debug)。 單元測試:將測試操作定義為聯合類型,以便維護邏輯樹。 匯出選項:**將 PDF、Excel、Word 等輸出目標表示為聯合實例。

範例 - 從 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;
' }
'}
這可讓您以清晰的邏輯來表示事件,並減少對公共物件類型或過度動態處理的依賴。
未來展望 — C# 是否會支援原生判別聯合?
目前已有人建議在 C# 中加入本機支援判別式合併,尤其是在對於更具表達力的類型系統的需求日益增加的情況下。 雖然 C# 語言尚未引入真正的聯合關鍵字,但 C# 仍在持續演進,使 record、模式匹配和切換表達式等功能更接近完整的判別聯合功能。
對現代化、功能友善的語言結構感興趣的 .NET 開發人員,請密切注意此空間。
最後的想法
在 C# 中使用判別聯合,即使沒有本機支援,也能大幅改善 IronPDF 應用程式中的結構和邏輯表示方式。 透過利用 record、切換表達式和基類,您將可使您的程式碼庫更具可讀性、可維護性和對錯誤的適應力,同時也可解開處理 PDF 相關工作的更具宣告性和表達力的方式。
如果您是軟體工程師,正在建構現代化、彈性化的 .NET 應用程式,此模式是您工具包中必備的工具。
立即免費試用 IronPDF
準備好讓您的 C# PDF 生成更上一層樓了嗎? 下載 IronPDF 並開始免費試用。 無論您是從 HTML 產生文件、登錄匯出檔案,或是使用判別聯合自動化報表,IronPDF 都能為您的應用程式提供應有的功能與效能。
常見問題解答
如何在 C# 中實作歧視聯合?
在 C# 中,您可以通過定義基類和幾個派生類來表示每個可能的情況,從而模擬歧視聯合。這種方法結合模式匹配,使您能夠有效地管理多個相關的資料類型。
模式匹配在歧視聯合中的作用是什麼?
C# 中的模式匹配在處理歧視聯合時至關重要,因為它使您能夠以簡潔的方式處理聯合的每種情況,改善程式碼可讀性並減少多個條件語句的需求。
歧視聯合與 C# 中的枚舉如何比較?
雖然歧視聯合和枚舉都允許您定義一組固定的選項,但歧視聯合提供了更多的靈活性,因為它們可以包含不同類型的資料,而枚舉僅限於單一資料類型的命名常量。
在使用歧視聯合時,我能否增強資料操作與 Iron Software?
是的,Iron Software 產品如 IronPDF 可以通過提供高級的資料處理和操作功能來補充歧視聯合,使在 .NET 應用程式中更容易操作和展示不同類型的資料。
在 C# 中使用歧視聯合的好處是什麼?
歧視聯合通過允許您定義具有特定可能形式的類型,從而在您的 C# 程式碼中提供增強的類型安全性、清晰度和可維護性,促進健壯的類型檢查和減少錯誤。
使用歧視聯合會如何影響程式碼的可讀性?
通過允許開發人員清晰地定義和處理多個相關資料類型,歧視聯合改善了程式碼可讀性。模式匹配進一步簡化程式碼,通過減少複雜條件邏輯的需求。
使用類來模擬歧視聯合在 C# 中的意義是什麼?
在 C# 中使用類來模擬歧視聯合涉及到創建一個基類並為每個情況創建衍生類,這提供了一種靈活且富有表現力的方式來模擬不同的相關類型,類似於函數式程式設計語言。
歧視聯合如何增強 C# 中的錯誤處理?
歧視聯合通過提供更精確的類型檢查和啟用模式匹配,可以在編譯時捕獲潛在的錯誤,從而提升應用程式的可靠性,提高錯誤處理能力。


