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

C#中无私有后备字段的只读属性能否赋值?示例解惑

C# 只读Getter属性的构造函数赋值逻辑

在C#中,仅含get修饰符的自动属性(也就是你示例里的public string Time { get; }),虽然没有显式的set或init setter,但编译器允许在类的构造函数中直接给它赋值,这是语言本身的设计规则。

具体原理

这种只读自动属性的底层,是编译器自动生成了一个readonly的私有字段来存储值。在对象创建的构造阶段,这个私有字段还处于可修改状态,所以你能在构造函数里给属性赋值;一旦构造函数执行完毕,这个私有字段就会被锁定,之后任何地方都无法再修改该属性的值,外部只能读取它。

和其他属性初始化方式的区别

  • 你提到的public string StringProperty { get; set; } = "";是带set setter的属性,它的赋值不受构造阶段限制,任何时候都能修改;
  • 只读属性也支持直接在属性声明时初始化,比如public string Time { get; } = DateTime.Now.ToLongTimeString();,但如果同时在构造函数里赋值,构造函数里的内容会覆盖声明时的初始值。

回到你的示例代码,TimeService的构造函数在对象实例化时给Time属性赋值,这完全符合C#的规则,对象创建完成后,Time的值就固定下来,外部只能读取,无法修改。

内容的提问来源于stack exchange,提问作者Anthony Voronkov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:38:21