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

字符串本身不可变,为何不可变类中字符串字段仍需标记readonly或使用init?

为什么不可变类里的字符串属性还要加readonly或init?

别搞混了字符串的不可变和类属性的不可变——这俩是完全不同的事儿:

  • 字符串的不可变是指它自身内容不能改:比如你拿到一个字符串"张三",没法直接把它改成"李四",只能创建新的字符串对象。但类里的字符串属性是个引用变量,它存的是指向这个字符串对象的地址,不是字符串内容本身。
  • readonly/init是锁住这个引用变量:不让它指向别的字符串对象。如果不加的话,就算字符串本身不能改,你还是能把这个属性换成另一个字符串。比如原来LastName是"Smith",没加readonly的话,类内部或者外部(如果有set方法)能把它改成"Johnson",这就破坏了整个类实例的不可变性——毕竟不可变类要求实例一旦创建,所有状态都不能变。

举个反例,要是你这么写:

public class ImmutableType
{
    public string LastName { get; set; }
}

哪怕字符串不可变,外部代码还是能直接obj.LastName = "NewName",这显然不是不可变类该有的样子。而加了readonly(或者用init-only属性)之后,这个属性只能在构造函数里赋值,实例创建后就再也没法改了,才能保证整个类的不可变性。

内容的提问来源于stack exchange,提问作者Aleksander Chelpski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:52:34