You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET是否内置类似ExpectNonNull的非空断言方法?

.NET是否提供类似ExpectNonNull的内置方法?

我在代码中会这样处理声明为可空类型但运行时期望非空的对象:

someObject.ExpectNonNull().SomeMember

对应的ExpectNonNull实现如下:

[return: NotNull]
public static T ExpectNonNull<T>(
    [NotNull] this T? arg,
    [CallerArgumentExpression(nameof(arg))] string arg_name = ""
)
    where T : class
{
    if (arg is null)
        throw new ArgumentNullException(
            arg_name,
            $"The argument `{arg_name}` with type {typeof(T).Name} is expected to be non-null, but is null."
        );
    return arg;
}

(还有针对值类型的版本。)

请问.NET框架本身是否提供了类似的内置方法?


.NET确实有类似功能的内置方法,核心选项如下:

  • ArgumentNullException.ThrowIfNull(.NET 6+):这个静态方法会检查参数是否为null,为空则抛出ArgumentNullException,并且会自动通过CallerArgumentExpression特性获取参数名称,和你实现的核心校验逻辑一致。用法示例:

    ArgumentNullException.ThrowIfNull(someObject);
    someObject.SomeMember;
    

    它的区别是不返回对象本身,无法链式调用,需要单独调用后再访问成员,但达成的运行时非空保障效果完全相同。

  • 针对值类型可空的场景,.NET提供了Nullable<T>.GetValueOrDefault,但它不会抛出异常,而是返回类型默认值或实际值,和你实现的“非空断言+抛出异常”的逻辑不符,所以如果需要空值时抛出异常,这个方法不适用。

另外,.NET的CodeAnalysis包中有NotNullAttribute等特性,但它们仅用于编译时静态分析,不属于运行时的非空断言方法。

如果坚持想要链式调用的形式,.NET没有完全一致的内置扩展方法,但你可以基于ArgumentNullException.ThrowIfNull快速封装自己的扩展方法,或者直接使用上述单独调用的形式即可满足需求。

内容的提问来源于stack exchange,提问作者Branko Dimitrijevic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:40:26