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

C#:如何让required字段通过初始化器初始化后设为readonly?

解决方案:私有构造函数+静态工厂方法

问题核心在于:required字段要求支持对象初始化器赋值,而readonly字段仅能在构造函数或字段声明阶段赋值,两者直接冲突,无法同时标注在同一个字段上。

结合你不想用公共构造函数、不想替换为属性的需求,可以采用私有构造函数+静态工厂方法的方案,既保证ID的只读性,又强制所有必填字段被初始化,同时避免位置参数混淆的问题:

public class Person
{
    public readonly uint ID;
    public required string Name;
    public required string Email;
    public required string PhoneNumber;
    public byte? Age;

    // 私有构造函数,禁止外部直接创建实例
    private Person(uint id)
    {
        ID = id;
    }

    // 静态工厂方法,明确参数含义,强制传入所有必填项
    public static Person Create(uint id, string name, string email, string phoneNumber, byte? age = null)
    {
        return new Person(id)
        {
            Name = name,
            Email = email,
            PhoneNumber = phoneNumber,
            Age = age
        };
    }

    public Person Clone()
    {
        // 调用私有构造函数复制ID,保证只读字段的初始化
        return new Person(ID)
        {
            Name = Name,
            Email = Email,
            PhoneNumber = PhoneNumber,
            Age = Age
        };
    }
}

方案优势:

  • ID只读性:通过readonly关键字保证ID初始化后无法被修改;
  • 强制初始化:工厂方法的必填参数(id/name/email/phoneNumber)会被编译器强制检查,确保不会遗漏;
  • 避免参数混淆:工厂方法的参数名称清晰明确,调用时既可以按位置传参,也可以使用命名参数(如Person.Create(id: 1001, name: "张三", ...)),降低混淆风险;
  • 符合原有习惯:保留了原有的字段结构,无需将字段替换为属性。

内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:30:16