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

