Почему строка. Замена (“X”, “Y”) работает только при присвоении новой строке?

Я предполагаю, что это должно сделать что-то со строкой, являющейся ссылочным типом, но я не добираюсь почему просто string.Replace("X","Y") не работает?

Почему я должен сделать string A = stringB.Replace("X","Y")? Я думал, что это - просто метод, который будет сделан на указанном экземпляре.

Править: Спасибо до сих пор. Я расширяю свой вопрос: Почему делает b+="FFF" работа, но b.Replace не?

6
задан Mark Byers 1 June 2010 в 14:50
поделиться

11 ответов

String.Replace - это общая функция класса строки, которая возвращает новую строку. Это не оператор текущего объекта. b.Replace ("a", "b") будет похож на строку, в которой есть только c + 1. Так же, как c = c + 1 фактически устанавливает значение c + 1 в c, b = b.Replace ("a", "b") устанавливает новую строку, возвращаемую в b.

0
ответ дан 8 December 2019 в 02:05
поделиться

Чтобы ответить на ваш расширенный вопрос, b + = "FFF" эквивалентно b = b + "FFF", поэтому в основном вы также создаете новую строку здесь.

0
ответ дан 8 December 2019 в 02:05
поделиться

Строки неизменяемы, что означает, что после их создания их больше нельзя изменить. Насколько я знаю, у этого есть несколько причин, в основном из-за производительности (как строки представлены в памяти).

См. Также (среди многих):

Как прямое следствие этого, каждая строковая операция создает новый строковый объект. В частности, если вы делаете такие вещи, как

foreach (string msg in messages)
{
    totalMessage = totalMessage + message;
    totalMessage = totalMessage + "\n";
}

, вы фактически создаете потенциально десятки или сотни строковых объектов. Итак, если вы хотите управлять строками более изощренно, следуйте подсказке GvS и используйте StringBuilder.

6
ответ дан 8 December 2019 в 02:05
поделиться

A StringBuilder поддерживает встроенный метод Replace.

Используйте StringBuilder, если вам нужно много манипулировать строками.

2
ответ дан 8 December 2019 в 02:05
поделиться

Строки неизменяемы. Любая операция по их изменению должна создавать новую строку.

3
ответ дан 8 December 2019 в 02:05
поделиться

Потому что строки неизменяемы. Каждый раз, когда вы изменяете строку .net создает новый строковый объект. Это свойство класса.

Неизменяемые объекты
Строковый объект

23
ответ дан 8 December 2019 в 02:05
поделиться

Чтобы быть более точным. string.Replace ("X", "Y") возвращает новую строку ... но поскольку вы не назначаете новую строку чему-либо, новая строка теряется.

0
ответ дан 8 December 2019 в 02:05
поделиться

Как уже было сказано выше, строки неизменяемы.

Это означает, что когда вы выполняете замену, вы получаете новую строку, а не изменяете существующую строку.

Если вы не сохраните эту новую строку в переменной (например, в переменной, в качестве которой она была объявлена), ваша новая строка нигде не будет сохранена.

0
ответ дан 8 December 2019 в 02:05
поделиться

Почему "b+="FFF" работает, а b.replace - нет

Потому что оператор += присваивает результат обратно левому операнду, конечно. Это просто сокращение для b = b + "FFF";.

Простой факт заключается в том, что вы не можете изменить ни одну строку в .Net. Для строк нет никаких методов экземпляра - вы должны всегда где-то присваивать результаты операции обратно строковой ссылке.

2
ответ дан 8 December 2019 в 02:05
поделиться

Почему не работает stringA.Replace ("X", "Y") ?
Зачем мне делать stringB = stringA.Replace ("X", "Y"); ?

Потому что строки неизменяемы в .NET. Вы не можете изменить значение существующего строкового объекта, вы можете только создавать новые строки. string.Replace создает новую строку, которую вы затем можете присвоить чему-либо, если хотите сохранить ссылку на нее. Из документации:

Возвращает новую строку , в которой все вхождения указанной строки в текущем экземпляре заменяются другой указанной строкой.

Акцент мой.


Итак, если строки неизменяемы, почему b + = "FFF"; работа?

Хороший вопрос.

Сначала обратите внимание, что b + = «FFF»; эквивалентно b = b + «FFF»; (за исключением того, что b вычисляется только один раз).

Выражение b + "FFF" создает новую строку с правильным результатом без изменения старой строки. Ссылка на новую строку затем присваивается b , заменяя ссылку на старую строку. Если нет других ссылок на старую строку, она станет пригодной для сборки мусора.

16
ответ дан 8 December 2019 в 02:05
поделиться

Да, это метод System.String. Но ты можешь попробовать a = a.Replace ("X", "Y");

1
ответ дан 8 December 2019 в 02:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: