Несколько недель назад я обнаружил, что строки в С# определяются как ссылочные типы, а не типы значений. Первоначально я был смущен этим, но потом после некоторого чтения я вдруг понял, почему важно хранить строки в куче, а не в стеке, потому что было бы очень неэффективно иметь очень большую строку, которая копируется по непредсказуемому номеру кадров стека. Я полностью согласен с этим.
Я чувствую, что мое понимание почти завершено, но есть один элемент, который мне не хватает - какая языковая функция использует строки, чтобы сохранить их неизменяемыми? Чтобы проиллюстрировать пример кода:
string valueA = "FirstValue";
string valueB = valueA;
valueA = "AnotherValue";
Assert.AreEqual("FirstValue", valueB); // Passes
Я не понимаю, какая языковая функция делает копию valueA, когда я назначаю ее значению B. Или, возможно, ссылка на valueA не изменяется, когда я назначаю ее значению B, только valueA получает новую ссылку на себя, когда я устанавливаю строку. Поскольку это тип экземпляра, я не понимаю, почему это работает.
Я понимаю, что вы можете перегрузить, например, операторы == и! =, но я не могу найти никакой документации по перегрузке операторов =. Какое объяснение?