【发布时间】:2011-09-10 14:19:18
【问题描述】:
众所周知,.NET 中的字符串是不可变的。 (好吧,not 100% totally immutable,但在设计上是不可变的,并且无论如何都被任何合理的人使用。)
这使得基本上没问题,例如,以下代码只是在两个变量中存储对同一字符串的引用:
string x = "shark";
string y = x.Substring(0);
// Proof:
fixed (char* c = y)
{
c[4] = 'p';
}
Console.WriteLine(x);
Console.WriteLine(y);
以上输出:
sharp
sharp
显然x 和y 指的是同一个string 对象。所以这是我的问题:为什么不Substring 总是 与源字符串共享状态? 字符串本质上是一个有长度的char* 指针,对吧?所以在我看来,至少在理论上应该允许以下内容分配一个 single 内存块来保存 5 个字符,两个变量只是指向该(不可变)块内的不同位置:
string x = "shark";
string y = x.Substring(1);
// Does c[0] point to the same location as x[1]?
fixed (char* c = y)
{
c[0] = 'p';
}
// Apparently not...
Console.WriteLine(x);
Console.WriteLine(y);
以上输出:
shark
park
【问题讨论】:
-
substring 创建基本字符串的新实例,不是吗?
-
在子字符串文档中:“此方法不会修改当前实例的值。相反,它返回一个从当前字符串的 startIndex 位置开始的新字符串。”我会说它永远不应该像你的第一个例子那样表现。如果您使用子字符串,那么应该期望创建不同的实例以进行进一步修改。
-
只是问...当你在类不变量中偷偷摸摸时,你真的希望 anything 工作吗?
-
为什么 .net 框架不将字母表的所有排列存储在内存中,而我们只是引用指向我们需要的部分的指针? :-)
标签: c# .net string substring immutability