IRONSOFTWAREHOME
开发者更新

C# 区别联合(开发者用法)

Jacob Mellor,Team Iron 的首席技术官
Jacob Mellor
Updated: 2026年4月23日

作为使用IronPDF进行动态PDF生成的.NET开发者,你经常需要表示和管理一系列特定类型——例如各种文档数据、日志信息、用户角色或导出选项。 这就是C#区分联合的概念发挥作用的地方。

虽然C#不像F#或Rust那样原生支持区分联合,但你仍然可以有效地模拟区分联合。 在这篇博客文章中,我们将深入探讨如何在C#中定义和使用区分联合类型,展示如何在真实世界的PDF处理中应用它,并探索这种模式所提供的好处——特别是在与模式匹配配对时。

What Are Discriminated Unions in C#?

区分联合,也称为标记联合或联合类型,允许变量从有限的可能选项集中持有一个值,其中每个选项都与唯一的案例标识符相关联。

在像F#这样的其他语言中,你可能会使用union关键字来定义它们。 C#没有提供这种特性,但开发者可以使用record、类和switch表达式的聪明组合来模拟它们。

例如:

public abstract record PdfAction;
public record GenerateReport(string ReportName) : PdfAction;
public record LogError(string Message) : PdfAction;
public record ExportToExcel(string FilePath) : PdfAction;

上面的每个记录都代表联合的一个案例。 基本的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");
    }
}

这种方法保持了代码的组织和强健,并使开发者更容易在单个位置理解所有可能的选项。

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

虽然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;
}

注意:使用结构体会失去一些模式匹配的好处,尤其是在依赖switch表达式时。

Benefits of Using Discriminated Unions in 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;
    }
}

这让你能够用清晰的逻辑表示事件,并减少对公共对象类型或过于动态处理的依赖。

Future Outlook – Will C# Ever Support Native Discriminated Unions?

已经有提议在C#中添加区分联合的原生支持,特别是在对更富表现力的类型系统的需求不断增长的情况下。 尽管该语言尚未引入真正的union关键字,但C#正在持续发展——带来像record、模式匹配和switch表达式等功能,逐步接近完整的区分联合功能。

.NET开发者若对现代、功能友好的语言结构感兴趣,将会想要密切关注这一领域。

最后的想法

在缺乏原生支持的情况下使用C#中的区分联合,仍然可以显著改善你在IronPDF应用程序中结构化和表示逻辑的方式。 通过利用记录、switch表达式和基类,你将使代码库更具可读性、可维护性,并且对错误更具抵御性——同时解锁更具声明性和表现力的方式来处理PDF相关任务。

如果你是一名构建现代、灵活的.NET应用程序的软件工程师,这种模式是你工具箱中的必备品。

立即免费试用IronPDF

准备好把你的C# PDF生成提升到一个新高度了吗? 下载IronPDF并开始免费试用。 无论你是从HTML生成文档、记录导出、还是使用区分联合自动化报告——IronPDF为你的应用提供了应有的强大和性能。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户