字符串本身不可变,为何不可变类中字符串字段仍需标记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
相关产品推荐
相关产品推荐

