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
相关产品推荐
相关产品推荐

