Всем, наверное, известно, что строки в .Net хоть и являются ссылочным типом, неизменяемы, что делает их поведение отчасти похожим на поведение значимых типов. То есть, вот в этом коде мы создали не две строки, а три:
string s1 = "te";
string s2 = "st";
s1 = s1 + s2;
В первой строке создается первая строка, во второй вторая, а в третьей - третья, адрес которой потом присваевается первой. В этом примере создание еще одной строковой переменной "за кулисами" кроме лишней траты памяти ничем не грозит, но вот вам еще один пример. Поинтереснее.
string s1 = "hello";
string s2 = s1;
Console.WriteLine(s1);
Console.WriteLine(s2);
Console.WriteLine();
s1 = "world";
Console.WriteLine(s1);
Console.WriteLine(s2);
В этом примере неизменяемость строк приводит к не очень очевидным результатам. Как думаете, что будет выведено на экран? Правильный ответ:
hello
hello
world
hello
И еще, чтобы окончательно запутать бедных программистов, тип string переопределяет оператор ==, чтобы он сравнивал не ссылки, а содержимое объектов. Что, впрочем, для строк очень часто одно и то же, что и сравнение по ссылке.
Так почему строки сделали неизменяемыми, спросите вы. Причин несколько.