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

使用位置记录构造函数/init属性时如何检查参数是否为null

C# Record 属性注释添加与运行时非空校验实现

可以在不将record转为class的前提下,实现运行时null赋值校验,以下是具体实现方案:

同时满足属性注释+非空校验的实现

你当前用到的显式重写record自动生成属性的方案是官方推荐的实现方式,可同时支持添加XML注释和自定义校验逻辑,根据.NET版本不同可进一步简化写法:

.NET 6 及以上版本(最简洁写法)

ArgumentNullException.ThrowIfNull方法执行校验后会直接返回传入的非空参数,可直接简化赋值逻辑:

public record Test(string TestString)
{
    /// <summary>
    /// 测试字符串属性
    /// </summary>
    public string TestString { get; init; } = ArgumentNullException.ThrowIfNull(TestString);
}

.NET 6 之前版本

使用null合并运算符抛出异常即可:

public record Test(string TestString)
{
    /// <summary>
    /// 测试字符串属性
    /// </summary>
    public string TestString { get; init; } = TestString ?? throw new ArgumentNullException(nameof(TestString));
}

其他record属性注释实现方案

如果不需要添加自定义运行时校验逻辑,可直接通过给主构造参数添加XML注释的方式实现,无需显式声明属性,写法更简洁:

/// <summary>
/// 测试记录类型
/// </summary>
/// <param name="TestString">测试字符串属性</param>
public record Test(string TestString);

该方案仅适合无额外校验需求的场景,无法自定义非空校验逻辑。

补充说明

  • 上述校验逻辑同时覆盖主构造传参、with表达式修改属性两个赋值场景,所有赋值操作都会触发校验
  • 若项目开启了可空引用类型校验,将属性声明为非空类型可在编译期提前发现null赋值风险,搭配运行时校验可实现双重保障

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:24:02