C#中default与default!的区别是什么?
解析C#中
default!的作用 先直接给出结论:default!不会改变实际运行时的值,string类型的default!仍然是null,它的作用完全针对编译器的静态分析,和运行时行为无关。
为什么要加!(null原谅运算符)
在启用**可空引用类型(NRT)**的项目中,编译器会对引用类型的空值情况做严格检查。对于这段record代码:
public record Person { public string FirstName { get; init; } = default!; public string LastName { get; init; } = default!; };
如果只写= default,编译器会抛出警告:因为string是非可空引用类型(不是string?),但default(string)的结果是null,编译器会判定这个属性可能违反非可空约定。
加上!之后,相当于开发者给编译器传递一个明确信号:我保证这个属性在实际使用时不会是null,无需触发空引用警告。这段代码的设计意图是,创建Person实例时一定会通过位置初始化器(比如new Person { FirstName = "张三", LastName = "李四" })或record的主构造函数给属性赋值,默认的null只是一个占位,不会被实际用到。
常见误区澄清
- 它不会把
null转换成空字符串,运行时属性的初始值还是null,如果开发者忘记初始化就直接使用,仍然会抛出NullReferenceException。 !仅用于抑制编译器的静态分析警告,不改变任何运行时逻辑,本质是开发者对编译器做出的“值非空”承诺。
内容的提问来源于stack exchange,提问作者Xeno Xetric
相关产品推荐
相关产品推荐

