Короткая версия: Нет это не должно указывать на тот же адрес. Он указывал на тот же адрес, но вы заменили адрес в ABC другим (результат замены).
Длинная версия
Подумайте об этом так - оператор присваивания (=), а также передать аргументы метода и возвращающие значения из метода всегда делает копию. Разница между ссылочными типами и типами значений - это то, что копируется. Когда значение представляет собой тип значения, все данные в памяти копируются в другое место в памяти. Сама переменная содержит данные. При работе со ссылочными типами переменная (как аргумент метода и возвращаемое значение метода) содержит адрес объекта в памяти. Вот почему, когда вы назначаете одну переменную другой, они указывают на один и тот же объект. Обе переменные сохраняют один и тот же адрес. Однако оператор = все еще выполняет копию одной переменной в другую. Он копирует адрес. Поэтому, когда вы назначаете возвращаемое значение из метода replace, вы копируете адрес новой строки в переменной ABC. Вы не копируете ничего в другой переменной. Они указывали на один и тот же объект, но теперь это не так, потому что адрес, скопированный в ABC, теперь отличается. Переменные ссылочных типов не связаны некоторой магией, с которой они связаны тем фактом, что они содержат адреса одного и того же объекта, но сами адреса являются просто цифрами. Если вы используете оператор = для переменной, вы заменяете объект. Если вы измените объект, значение изменится в обеих переменных, но если вы замените объект, переменные будут содержать разные объекты.
Обратите внимание, что это справедливо и для аргументов метода.
List<string> list = new List<String> { "asdf" };
SomeMethod(list);
//list contains "asdf", "fdsa"
SoemOtherMethod(list),
//list is NOT null
static void SomeMethod(List<string> list)
{
list.Add("fdsa"); //changes the original list
}
static void SomeOtherMethod(List<string> list)
{
list = null; //cannot replace the original list only replaces the address in the argument variable
}
Ответ на этот вопрос «потому что строка неизменна в .NET». Это подсказывает следующий вопрос: почему они неизменны? - на который отвечает ссылка выше. – Yuck
@aloisdg: Достаточно разумно ожидать, что изменение в строке будет видно из обеих переменных, так как это именно то, что произойдет. То, что отсутствует в рассуждениях, состоит в том, что строки неизменяемы, поэтому изменений в строке не будет. – Guffa