.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
相关产品推荐
相关产品推荐

