Назначение строк в C #

Несколько недель назад я обнаружил, что строки в C # определены как ссылочные типы, а не как типы значений. Сначала я был сбит с толку, но после некоторого чтения я внезапно понял, почему важно хранить строки в куче, а не в стеке - потому что было бы очень неэффективно иметь очень большую строку, которая копируется с непредсказуемым числом. кадров стека. Я полностью согласен с этим.

Я чувствую, что мое понимание почти завершено, но есть один элемент, который мне не хватает - какую языковую функцию используют строки, чтобы сохранить их неизменность? Чтобы проиллюстрировать это примером кода:

string valueA = "FirstValue";
string valueB = valueA;
valueA = "AnotherValue";

Assert.AreEqual("FirstValue", valueB); // Passes

Я не понимаю, какая языковая функция создает копию valueA, когда я присваиваю ее valueB. Или, возможно, ссылка на valueA не меняется, когда я назначаю ее valueB, только valueA получает новую ссылку на себя, когда я устанавливаю строку. Поскольку это тип экземпляра, я не понимаю, почему это работает.

Я понимаю, что вы можете перегрузить, например, операторы == и! =,но я не могу найти никакой документации по перегрузке операторов =. Каково объяснение?

20
задан Peter Mortensen 16 January 2014 в 20:53
поделиться