C#的required关键字的具体使用

 更新时间:2025年11月10日 10:01:46   作者:siyun.chen  
C#11引入的required关键字强制要求某些属性或字段在对象初始化时必须被显式赋值,增强了代码的安全性和灵活性,本文就来介绍一下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 设计和数据模型定义。

到此这篇关于C#的required关键字的具体使用的文章就介绍到这了,更多相关C# required关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • WPF开发之UniformGrid和ItemsControl的应用详解

    WPF开发之UniformGrid和ItemsControl的应用详解

    为了简化开发,WPF提供了UniformGrid布局和ItemsControl容器,本文以一个简单的小例子,简述如何在WPF开发中应用UniformGrid和ItemsControl实现均匀的布局,希望对大家有所帮助
    2024-01-01
  • C#从实体对象集合中导出Excel的代码

    C#从实体对象集合中导出Excel的代码

    数据的导出是项目中经常要实现的功能,就拿最常见的要导出成Excel来说,网上看来看去,都是介绍从Datatable中导出
    2008-08-08
  • C#简单实现SNMP的方法

    C#简单实现SNMP的方法

    这篇文章主要介绍了C#简单实现SNMP的方法,通过一个简单的自定义类分析了C#实现SNMP的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#实现读取ini配置文件的内容

    C#实现读取ini配置文件的内容

    INI就是扩展名为"INI"的文件,其实他本身是个文本文件,可以用记事本打开,本文主要为大家详细介绍了C#实现读取ini配置文件内容的方法,需要的小伙伴可以了解下
    2023-12-12
  • C#调用百度地图API根据地名获取经纬度geocoding

    C#调用百度地图API根据地名获取经纬度geocoding

    本文主要介绍了C#调用百度地图API根据地名获取经纬度geocoding,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • C# Websocket连接实现wss协议

    C# Websocket连接实现wss协议

    本文主要介绍了C# Websocket连接实现wss协议,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C#利用KPM算法解决字符串匹配问题详解

    C#利用KPM算法解决字符串匹配问题详解

    Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP算法”,常用于在一个文本串S内查找一个模式串P 的出现位置。本文将利用该算法解决字符串匹配问题,感兴趣的可以学习一下
    2022-11-11
  • C#实现批量给图片添加水印的示例代码

    C#实现批量给图片添加水印的示例代码

    这篇文章主要为大家详细介绍了如何利用C#实现批量给图片添加水印的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-12-12
  • C#封装DBHelper类

    C#封装DBHelper类

    DBHelper类是用类将ADO.NET用方法封装起来,用以减少程序员的工作量。本文为大家提供一个C#封装的DBHelper类,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • WPF实现时钟特效

    WPF实现时钟特效

    这篇文章主要介绍了WPF实现时钟特效,过程很简单,感兴趣的小伙伴们可以参考一下
    2015-11-11

最新评论