gpt4 book ai didi

c# - 为什么 string.Substring 不与源字符串共享内存?

转载 作者:IT王子 更新时间:2023-10-29 04:01:23 25 4
gpt4 key购买 nike

众所周知,.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

显然 xy 指的是同一个 string 对象。所以这是我的问题:为什么 Substring总是与源字符串共享状态?一个字符串本质上是一个char* 有长度的指针,对吧?所以在我看来,至少在理论上应该允许以下内容分配一个单个内存块来容纳 5 个字符,两个变量简单地指向该(不可变) block 内的不同位置:

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

最佳答案

有两个原因:

  • 字符串元数据(例如长度)与字符存储在同一内存块中,允许一个字符串使用另一个字符串的部分字符数据意味着您必须分配两个内存块对于大多数字符串而不是一个。由于大多数字符串不是其他字符串的子字符串,因此额外的内存分配会比重用部分字符串所获得的内存消耗更多。

  • 在字符串的最后一个字符之后存储了一个额外的 NUL 字符,以使该字符串也可用于期望以空字符结尾的字符串的系统函数。您不能在属于另一个字符串的子字符串之后放置额外的 NUL 字符。

关于c# - 为什么 string.Substring 不与源字符串共享内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6274500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com