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

C# .NET中用default!初始化record成员的作用与原理是什么?

C# Record里default!的作用与原理

先拆解这两部分的作用,再结合record的场景说清楚:

1. default本身的作用

default是C#里用来获取类型默认值的关键字:

  • 值类型(比如int、DateTime)会返回零值或默认实例
  • 引用类型(比如string、自定义类)会返回null

这段代码里string是引用类型,所以default实际就是null。

2. 加!(空原谅运算符)的原因

从C# 8.0开始有了可为空引用类型的特性,开启后编译器会严格检查引用类型的空值问题:

  • 默认情况下,string被标记为「不可为null」的类型
  • 如果你直接给string属性赋值default(也就是null),编译器会抛出警告:提示非空引用类型的字段必须在构造函数结束时持有非null值

!的作用就是告诉编译器:"我清楚这个值可能是null,但我保证实际使用时它不会是null,别给我弹出警告"。它只影响编译阶段,完全不改变运行时的实际值。

3. 为啥在Record的init属性里这么写

Record的init属性是仅能在初始化阶段赋值的属性,这段代码的设计意图是:

  • 允许通过对象初始化器(比如new Person { FirstName = "张三" })创建实例,无需额外编写自定义构造函数
  • 如果用户初始化时未给某个属性赋值,该属性会被设为null,通过default!可以压制编译器的非空警告

4. 实际项目里的更优替代方案

微软这段代码是为了演示record的基础结构,实际开发中如果想确保属性非空,更严谨的做法是:

  • 编写带参数的主构造函数:public Person(string firstName, string lastName) { FirstName = firstName; LastName = lastName; },强制创建实例时必须传入属性值
  • 或者使用C# 11+的required修饰符:public required string FirstName { get; init; },同样能强制用户初始化属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:39:14