C#中无私有后备字段的只读属性能否赋值?示例解惑
C# 只读Getter属性的构造函数赋值逻辑
在C#中,仅含get修饰符的自动属性(也就是你示例里的public string Time { get; }),虽然没有显式的set或init setter,但编译器允许在类的构造函数中直接给它赋值,这是语言本身的设计规则。
具体原理
这种只读自动属性的底层,是编译器自动生成了一个readonly的私有字段来存储值。在对象创建的构造阶段,这个私有字段还处于可修改状态,所以你能在构造函数里给属性赋值;一旦构造函数执行完毕,这个私有字段就会被锁定,之后任何地方都无法再修改该属性的值,外部只能读取它。
和其他属性初始化方式的区别
- 你提到的
public string StringProperty { get; set; } = "";是带setsetter的属性,它的赋值不受构造阶段限制,任何时候都能修改; - 只读属性也支持直接在属性声明时初始化,比如
public string Time { get; } = DateTime.Now.ToLongTimeString();,但如果同时在构造函数里赋值,构造函数里的内容会覆盖声明时的初始值。
回到你的示例代码,TimeService的构造函数在对象实例化时给Time属性赋值,这完全符合C#的规则,对象创建完成后,Time的值就固定下来,外部只能读取,无法修改。
内容的提问来源于stack exchange,提问作者Anthony Voronkov
相关产品推荐
相关产品推荐

