属性初始化器语法支持声明时赋初值,简化代码;自动实现属性可直接用=设默认值;required+init确保必填且不可变;c#14起set中可用field简化验证逻辑。

属性初始化器语法能让成员变量在声明时直接赋初值,省去构造函数里的重复赋值,代码更紧凑、意图更清晰。
自动实现属性 + 初始化器
这是最常用也最简洁的方式。你不需要写 backing field,也不用进构造函数,直接在属性声明后加 = 赋值即可:
- 字符串设为空字符串而非 null:
public string Name { get; set; } = string.Empty; - 数字设为非零默认值:
public int Score { get; set; } = 100; - 集合初始化为新实例:
public List<string> Tags { get; set; } = new();</string>
配合 init-only 属性保证初始化完整性
如果希望某个属性必须在对象创建时设置、之后不可变,可以用 required + init:
-
public required string Id { get; init; }强制调用方使用对象初始值设定项赋值 - 搭配初始化器可设“兜底值”,但 required 会覆盖它,确保不被忽略
- 例如:
public required string Title { get; init; } = "Untitled";—— 若未显式赋值,编译报错;若赋了值,则用传入值
字段支持的属性中用 field 简化验证逻辑
C# 14 起支持在 set 访问器里直接用 field 关键字操作编译器生成的后备字段,避免手动声明私有字段:
public string Email { get; set => field = value?.Trim() ?? string.Empty; }public int Age { get; set { if (value >= 0 && value- 这种写法既保留验证能力,又不破坏初始化器的简洁性
注意初始化顺序和语义差异
属性初始化器在构造函数体执行前运行,但晚于字段初始化器;它适用于所有实例属性,包括只读(get-only)属性:
- 只读属性也能初始化:
public DateTime CreatedAt { get; } = DateTime.UtcNow; - 多个属性初始化器按声明顺序执行,与构造函数参数无关
- 若同时在构造函数中赋值,初始化器的值会被覆盖(除非是 get-only 属性)










