Строка неизменна , пока вы не начнете связываться с небезопасным кодом , поэтому разработчики языка решили не добавлять функцию, которая не нужна при обычном использовании .Это не значит, что в определенных ситуациях это не пригодится.
Если вы сделаете это:
string a = "foobar";
string b = a;
Mutate(a, "raboof");
Console.WriteLine("b={0}", b);
где:
unsafe void Mutate(string s, string newContents)
{
System.Diagnostics.Debug.Assert(newContents.Length == s.Length);
fixed (char* ps = s)
{
for (int i = 0; i < newContents.Length; ++i)
{
ps[i] = newContents[i];
}
}
}
Вы можете быть удивленычтобы знать, что , хотя строка 'a' является мутировавшей , на выходе получится:
b=raboof
В этой ситуации нужно написать:
string a = "foobar";
string b = new String(a);
Mutate(a, "raboof");
Console.WriteLine("b={0}", b);
И ожидайте увидеть вывод вроде:
b=foobar
Но вы не можете, потому что он не является частью реализации System.String.
И я предполагаю разумное обоснованиетак как это дизайнерское решение заключается в том, что любой, кому удобно писать что-то вроде небезопасного метода Мутата, также способен реализовать метод для клонирования строки.