OneOf C# (.NET) 完整指南:安装、方法与实战示例
OneOf 库是 C# 语言中判别联合体(Discriminated Unions)的优雅实现。它解决了一个核心问题:在静态类型语言中,如何优雅地表示一个值可能属于多个预定义类型之一。相比使用 object 进行类型转换、Nullable 或创建复杂的类层次结构,OneOf 提供了一种类型安全且表达力强的方式来处理这类值。
为什么要用 OneOf?首先,它能显著提升代码可读性:一个返回 OneOf<Success, Error> 的方法签名,立刻告诉调用者操作可能成功或失败。其次,它消除了因错误类型转换导致的一整类 Bug。最后,OneOf 强制开发者处理所有可能的情况,使代码更健壮、更可预测。这在传统上使用异常(用于控制流)或返回 null 的场景中尤其有用。
OneOf 完美契合 C# 的函数式编程风格。它让你能更精确地建模业务领域:与其创建一个带有标志位和嵌套对象的 Result 类,不如直接使用 OneOf<T0, T1, T2>,其中每个类型代表一种可能的状态。这让代码更具声明性,并减少了大量的 if-else 结构。
安装
通过 NuGet 包管理器安装 OneOf 库。根据你的工具选择以下命令之一:
# Package Manager Console
Install-Package OneOf
# .NET CLI
dotnet add package OneOf
# PackageReference(手动添加到 .csproj 文件)
<PackageReference Include="OneOf" Version="3.0.271" />
安装完成后,在代码文件开头添加 using OneOf;。
快速上手
来看一个最简单的例子:一个除法函数。与其在除数为零时抛出异常,我们返回 OneOf<double, string> —— 要么是计算结果,要么是错误信息。
using OneOf;
public OneOf<double, string> SafeDivide(double a, double b)
{
if (b == 0)
return "错误:除数不能为零";
return a / b;
}
// 使用示例
var result = SafeDivide(10, 2);
result.Switch(
value => Console.WriteLine($"结果:{value}"),
error => Console.WriteLine($"错误:{error}")
);
// 输出:结果:5
注意:我们没有使用 out 参数,没有检查 null,也没有捕获异常。我们只需要调用 Switch 或 Match 方法,并为每个可能的情况提供处理函数即可。
核心方法与类
OneOf 库提供了几个关键机制来处理判别联合体。下面逐一详细介绍。
1. OneOf<T0, T1, ...>
签名: public class OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> : IOneOf
功能: 基础类,表示一个值可以是指定类型中的任意一种。最多支持 9 种类型。支持从任意指定类型到 OneOf 的隐式转换。
OneOf<int, string, bool> value = 42; // 隐式转换
value = "hello";
value = true;
// 显式创建
var explicitValue = new OneOf<int, string>(100);
2. Switch 方法
签名: public void Switch(Action<T0> f0, Action<T1> f1, ...)
功能: 根据 OneOf 中实际存储的值,执行对应的处理函数。该方法不返回任何值。