Как мы все знаем, строки в .NET неизменяемы. (Ну, не на 100% полностью непреложный, но неизменный по дизайну и используемый как таковой любым разумным человеком, во всяком случае.)
Это делает его в основном ОК, что, например, следующий код просто сохраняет ссылку на ту же строку в двух переменных:
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*
с длиной, правильно? Поэтому мне кажется, что по меньшей мере теоретически разрешено выделять один блок памяти для хранения 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