Как мы все знаем, строки в .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
. Итак, вот мой вопрос: почему бы Подстрока
всегда не разделять состояние с исходной строкой? Строка по сути является указателем 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