Что значит «Строки в C# неизменяемы»?

239
19 декабря 2017, 15:24

Пытаюсь понять что значит «строки не «изменяемы»? И казалось бы в этой статье автор из кожи вон лез и все по полочкам расставил, но я не понял. И для начала хотел бы понять как примерно выглядит память на разных этапах выполнения ниже представленного кода:

string str1 = "string1";
string str2 = str1;
str2 = str1 + "+2";

1) И так, после выполнения

string str1 = "string1";

происходит:

2) Далее, после выполнения

string str2 = str1;

память выглядит так:

Т.е. создается ссылка str2 которая указывает на новый участок памяти и туда копируется строка из str1.

Я правильно описал этот код?

Answer 1

Я правильно описал этот код?

Нет. string str2 = str1 здесь вы копируете ссылку в новую переменную. А здесь str2 = str1 + "+2" вы создали новый объект. str1 продолжает ссылаться на старый.

Можно проверить равенство ссылок, с помощью ReferenceEquals

string str1 = "string1"; //создан первый объект, ссылка на него присвоена переменной str1
string str2 = str1; //ссылка на первый объект присвоена ещё и переменной str2
Сonsole.WriteLine(object.ReferenceEquals(str1,str2)); //true
str2 = str1 + "+2"; //создан второй объект, ссылка на него присвоена переменной str2
Сonsole.WriteLine(object.ReferenceEquals(str1,str2)); //false

Строки "неизменяемы" это значит, что несмотря на то, что это объекты ссылочного класса, они имеют признак типов-значений -- неизменяемость. Создав один раз объект string вы просто не сможете его изменить, нет ни одного метода для этого.

Даже так str2[0] = '!' вы не сможете сделать, компилятор не даст вам изменить объект строки таким способом. А такие методы как Replace, Substring, Trim возвращают новый объект.

READ ALSO
Windows Services и запуск функции по таймеру

Windows Services и запуск функции по таймеру

Пытаюсь написать службу которая каждую минуту будет записывать в файл фразу, предположим "Hello World" с новой строки

243
Проблема с сериализацией nullable type свойств

Проблема с сериализацией nullable type свойств

К проекту подключен внешний Service ReferenceСгенерированный код в Reference

215
Максимальный размер Slider Unity

Максимальный размер Slider Unity

Имеется Slider ,в инспекторе maxValue = 50 , программно задаю maxValue = 100 при запуске как было 50 так и остается, почему? Пробовал из в Awake и Start, тот де результат...

223
Не срабатывает событие keydown

Не срабатывает событие keydown

Событие нажатия клавиши альт срабатывает только один раз, но при клике правой кнопкой мыши в рабочей области снова срабатывает один раз

209