如果字符串是不可变的,为什么我要在不可变类中将字符串字段标记为只读

问题描述 投票:0回答:2

我有一个只有不可变属性的不可变类。字符串是不可变的,所以为什么我必须将字符串字段标记为只读或在该类中使用“init”?

public class ImmutableType
{
    public readonly string LastName { get; }
}
c#
2个回答
0
投票

类型

System.String
或 C# 别名
string
是引用类型。假设它是可变的,我们可以写:

string s = "hello";
string t = s;
s[1] = 'a'; // Not possible
Console.WriteLine(s);
Console.WriteLine(t);

作为引用类型意味着在第二次赋值后,两个变量

s
t
都指向同一个字符串对象。改变分配给
s
的字符串也会影响您通过
t
看到的内容。因此,这会打印

hallo
hallo

为了避免这种误导行为,字符串是不可变的。即,如果要将“hello”更改为“hallo”,则必须创建一个新字符串。例如。与:

s = s[0] + 'a' + s[2..]; // replaces s[1] = 'a';

由于新字符串被分配给

s
,因此这不会影响
t
,它仍然指向原始的“hello”字符串对象。


readonly
的作用是禁止在类构造之后对变量进行赋值。


0
投票

字符串是不可变的,从某种意义上说,您无法更改字符串对象的值。这意味着所有字符串操作代码都将生成一个新的字符串对象。

只读字段、属性值可以通过构造函数或对象初始值设定项设置。 readonly 主要用于捕获“注入”数据,其值不应被接收者对象更改。

因此,字符串不变性仅限于字符串对象本身。而 readonly 的范围是任何对象的整个生命周期。

© www.soinside.com 2019 - 2024. All rights reserved.