Роль, которую играет утверждение в объяснении, зависит от самого объяснения. Это может быть вредно или полезно, в зависимости от остального объяснения.
Лично я бы не стал использовать это утверждение, пока довольно поздно в объяснении (по крайней мере, в наши дни). Неизменность строк только мешает - как это происходит с объяснениями при передаче параметров. Я бы начал с объяснения с использованием изменяемого класса, например:
House x = new House(Color.Green); // The has a green front door
House y = x;
x = new House(Color.Red);
Console.WriteLine(y.FrontDoorColor); // Still green!
Здесь я бы объяснил, что x
и y
подобны бумажкам с адресами домов. Присвоение во второй строке не копирует дом - оно копирует адрес дома. Назначение в строке третья не меняет цвет входной двери в первом доме - оно создает новый дом, а затем стирает адрес на первом листе бумаги (x
) и записывает новый адрес. Это ничего не меняет в первом доме или втором листе бумаги (y
).
Я бы тогда привел второй пример:
House x = new House(Color.Green); // The has a green front door
House y = x;
x.FrontDoorColor = Color.Red; // Repainting a front door
Console.WriteLine(y.FrontDoorColor); // Red!
На этот раз есть только один дом - если я нарисую дверь дома, и вы придете к ней по адресу, который я дал вам ранее, вы увидите, что входная дверь теперь красная.
Пока все хорошо. Теперь Я мог бы вернуться к исходному примеру и сказать, что он уже выглядит как первый фрагмент дома, а не как второй, поэтому он ведет себя так же. Затем я могу сказать, что неизменность строк означает, что вы даже не можете писать код, который выглядит как пример второго дома, но с использованием строк. Таким образом, неизменность строки не была бы немедленно релевантной для объяснения существующего кода, но все равно появилась бы в том же ответе.
(Я также должен указать, что, хотя ссылки ведут себя как реальные адреса, я не утверждаю, что они совпадают с "адресами памяти" или указателями. Они не должны быть . Я использую термин в строгой аналогии с реальным миром, и это все. Это обратная сторона примера, но я не думаю, что это приносит слишком много вреда.)
Я мог бы , а затем также поговорить о типах значений и подумать, что произошло бы, если бы House
был типом значений, а также препятствовать изменяемым типам значений.
Чтобы узнать, будет ли мой ответ по-прежнему актуален в языке с изменяемыми строками, нам нужно знать больше о том, как ведут себя строковые литералы. Язык, который во всех отношениях совпадает с C # , отличным от изменчивости строк, будет ужасным языком, как вы могли бы написать:
// Hypothetical bad language
string x = "dog";
x.MutateTo("cat");
Console.WriteLine("dog"); // Prints cat!
Это явно нежелательно, поэтому, вероятно, поведение строковых литералов должно измениться. Вы также говорите о возможных изменениях в значении оператора присваивания и т. Д. ... трудно сделать конкретные заявления о гипотетическом языке, не зная точно, как он себя ведет.