如何避免C# record struct主构造函数生成带setter的属性?
让C# record struct属性仅保留getter的方法
要阻止编译器为record struct的自动生成属性添加setter,你可以用以下几种方式:
1. 显式声明只读属性
手动定义属性并指定只读访问器,再通过构造函数完成赋值:
public record struct MyStruct { // 仅允许在构造或对象初始化器阶段赋值 public bool MyValue { get; init; } public MyStruct(bool myValue) => MyValue = myValue; }
如果需要完全不可变(编译阶段就限制任何后续修改),可以用readonly修饰属性:
public record struct MyStruct { public readonly bool MyValue { get; } public MyStruct(bool myValue) => MyValue = myValue; }
2. 主构造函数结合readonly修饰符
在C# 10及以上版本中,直接在主构造函数的参数前添加readonly关键字,编译器会自动生成仅带getter的只读属性,不会生成setter:
public record struct MyStruct(readonly bool MyValue);
为什么in修饰符没用?
in关键字仅控制构造函数参数的传递方式(按只读引用传递),不会改变生成属性的可变性,因此无法阻止setter的生成。
内容的提问来源于stack exchange,提问作者user3797758
相关产品推荐
相关产品推荐

