C#的required关键字

在 C# 11 中引入了 required 关键字,用于强制要求某些属性或字段在对象初始化时必须被显式赋值。这一特性增强了代码的安全性,确保关键成员不会被遗漏初始化,同时保持了对象初始化的灵活性(例如使用对象初始化器)。


核心概念

  • 作用:标记类或结构体中的属性/字段为“必须初始化”的成员。
  • 强制赋值:创建对象时,必须为所有 required 成员提供初始值,否则编译器报错。
  • 兼容性:可与构造函数、对象初始化器(new Type { Prop = value })结合使用。
  • 与构造函数的对比:相比通过构造函数参数强制初始化,required 允许更灵活的初始化方式(如按名称赋值)。

基本用法

1. 定义 required 成员
public class Person
{
    public required string Name { get; set; }
    public required int Age { get; set; }
}
2. 初始化时必须赋值
// 正确:通过对象初始化器赋值
var person = new Person { Name = "Alice", Age = 30 };

// 错误:缺少 Age 的赋值
var invalidPerson = new Person { Name = "Bob" }; // 编译错误!

与构造函数的协作

若构造函数已初始化 required 成员,需标记 [SetsRequiredMembers] 特性,避免重复赋值:

public class Person
{
    public required string Name { get; set; }
    public required int Age { get; set; }

    [SetsRequiredMembers]
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

// 调用构造函数时,无需再初始化 required 成员
var person = new Person("Alice", 30);

注意事项

  1. 适用类型required 可用于属性或字段,支持引用类型和值类型。
  2. 不可省略:未初始化 required 成员会导致编译错误。
  3. 与 Nullable 的协作
    public required string? OptionalDescription { get; set; } // 允许可为 null 的 required 成员
    
  4. 版本要求:需使用 C# 11 或更高版本(.NET 7+)。

使用场景

  • 替代多参数构造函数:当类有大量必填属性时,避免编写冗长的构造函数。
  • 明确初始化责任:强制调用方为关键属性提供值,减少运行时错误。
  • DTO 或配置对象:确保反序列化或配置绑定时必要字段被赋值。

示例:灵活初始化

public class Configuration
{
    public required string ApiKey { get; set; }
    public int Timeout { get; set; } = 30; // 非 required,可省略(使用默认值)
}

// 初始化时只需赋值 ApiKey
var config = new Configuration { ApiKey = "secret-key" };

通过 required 关键字,C# 提供了一种更直观、安全的方式确保对象初始化的完整性,尤其适用于现代 API 设计和数据模型定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值