属性getter前readonly关键字含义及无作用却添加原因咨询
关于C#中
readonly get属性的疑问 问题背景
查看Point类型定义时看到如下代码:
public int X { readonly get => x; set => x = value; }
对此有两个疑问:
- 明确该属性并非只读(因为包含setter),那
readonly get是什么含义?上述getter和setter具体表示什么? - 看到资料提到:
readonly可以应用于某些自动实现的属性,但不会产生有意义的效果。无论是否存在readonly关键字,编译器都会将所有自动实现的getter视为只读。
既然该关键字无实际作用,为何还要添加它?
解答
1. readonly get的含义与getter/setter的作用
readonly修饰getter时,是将getter方法标记为只读成员,意味着在这个getter内部,不能修改当前类的任何实例字段(readonly字段在构造函数内的修改除外)。- 这段代码里的属性不是只读属性——因为存在setter,外部依然可以通过
X = ...修改属性值。readonly只作用于getter本身,不影响整个属性的可写性。 - 具体逻辑:
readonly get => x;:这个getter仅负责返回私有字段x的值,内部无法修改类的实例状态,符合readonly的约束。set => x = value;:setter接收外部传入的value,赋值给私有字段x,实现属性值的修改。
2. 为何添加无实际作用的readonly关键字?
- 明确代码意图:开发人员通过添加
readonly,可以直观地向其他阅读代码的人传达“这个getter不会修改任何实例状态”的意图,提升代码可读性。 - 团队编码规范:部分团队的编码规则会要求所有无状态修改的getter都加上
readonly,哪怕编译器默认处理,以此保持代码风格的统一。 - 潜在的版本兼容:虽然当前编译器对自动实现属性的getter默认视为只读,但未来C#版本可能对
readonly get扩展新语义,提前添加可降低后续代码调整成本。
内容的提问来源于stack exchange,提问作者Ashkan Mobayen Khiabani
相关产品推荐
相关产品推荐

