Почему string.Substring не разделяет память с исходной строкой?

Как мы все знаем, строки в .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

37
задан Dan Tao 8 June 2011 в 05:18
поделиться