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

.NET中[Required]、required关键字与=null!的等价性及写法问询

关于C#中[Required]特性与required关键字的疑问解答

能否直接改写代码?

不能直接等价替换,两者的作用场景和机制完全不同:

  • 原代码里的[Required]是System.ComponentModel.DataAnnotations提供的运行时数据验证特性,主要用于ASP.NET Core等场景的模型验证,会在接口接收参数时检查该属性是否为空。
  • 新代码里的required是C# 11引入的编译级关键字,作用是强制调用者在创建SearchQuery对象时必须显式给SearchText赋值,否则编译报错,但它不负责运行时的参数验证。

如果需要同时保留编译时强制初始化检查和运行时模型验证,应这样写:

using System.ComponentModel.DataAnnotations;

public class SearchQuery 
{
   [Required]
   public required string SearchText { get; set; }
}

如果仅需要编译时确保属性被初始化、不需要运行时验证,可改成新代码的形式,但要注意原有的接口参数验证功能会丢失。

=null!是不是required的旧实现方式?

完全不是。=null!的作用是抑制Nullable引用类型的空警告:在启用Nullable引用类型的项目中,非可空的引用类型属性如果没有显式初始化,编译器会抛出空警告,null!是告诉编译器“我确认这个属性在运行时不会为null,忽略警告”,它没有任何强制赋值的约束,只是消除编译警告。

而required关键字是C# 11新增的语法,专门用来强制对象创建时必须给属性赋值,是编译级别的强制检查,和=null!的功能没有继承关系。原代码里的=null!只是配合[Required]使用,用来消除非可空属性未初始化的警告而已。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:19:53