Люди, кажется, не понимают вопроса. Никто не утверждает, что строковые объекты не являются неизменяемыми. Суть спора в том, что он выдумал:
и переменная b продолжает удерживать
"Ч"
Я согласен с ФП в том, что эта часть документа неверна по двум причинам:
(1) В очевидном интуитивном смысле, что если вы напечатаете (b) (или что-то еще в этом языке на правильном утверждении) после двух строк образца, вы получите «привет» в результате.
(2) В строгом смысле, переменная b не содержит"h", "hello" или любое строковое значение. Он содержит ссылку на строковый объект.
Содержимое переменной b изменяется в результате присваивания - оно изменяется от точки к строковому объекту "h" на указатель на строковый объект "привет".
Когда они говорят «держи», они на самом деле имеют в виду «указывает». И они не правы, после того, как присвоение b больше не указывает на «h».
Я думаю, что пример, который они действительно хотели привести, таков:
string a = "h";
string b = a;
b += "ello";
Дело в том, что я бы, по-моему, все еще указывал на "h"; то есть присвоение b не изменяет объект, на который он указывал, оно создает новый объект и изменяет b так, чтобы оно указывало на него.
(на самом деле я не пишу на C #, но это мое понимание.)