Я предполагаю, что это должно сделать что-то со строкой, являющейся ссылочным типом, но я не добираюсь почему просто string.Replace("X","Y")
не работает?
Почему я должен сделать string A = stringB.Replace("X","Y")
? Я думал, что это - просто метод, который будет сделан на указанном экземпляре.
Править: Спасибо до сих пор. Я расширяю свой вопрос: Почему делает b+="FFF"
работа, но b.Replace
не?
String.Replace - это общая функция класса строки, которая возвращает новую строку. Это не оператор текущего объекта. b.Replace ("a", "b") будет похож на строку, в которой есть только c + 1. Так же, как c = c + 1 фактически устанавливает значение c + 1 в c, b = b.Replace ("a", "b") устанавливает новую строку, возвращаемую в b.
Чтобы ответить на ваш расширенный вопрос, b + = "FFF" эквивалентно b = b + "FFF", поэтому в основном вы также создаете новую строку здесь.
Строки неизменяемы, что означает, что после их создания их больше нельзя изменить. Насколько я знаю, у этого есть несколько причин, в основном из-за производительности (как строки представлены в памяти).
См. Также (среди многих):
Как прямое следствие этого, каждая строковая операция создает новый строковый объект. В частности, если вы делаете такие вещи, как
foreach (string msg in messages)
{
totalMessage = totalMessage + message;
totalMessage = totalMessage + "\n";
}
, вы фактически создаете потенциально десятки или сотни строковых объектов. Итак, если вы хотите управлять строками более изощренно, следуйте подсказке GvS и используйте StringBuilder.
A StringBuilder поддерживает встроенный метод Replace.
Используйте StringBuilder, если вам нужно много манипулировать строками.
Строки неизменяемы. Любая операция по их изменению должна создавать новую строку.
Потому что строки неизменяемы. Каждый раз, когда вы изменяете строку .net создает новый строковый объект. Это свойство класса.
Чтобы быть более точным. string.Replace ("X", "Y") возвращает новую строку ... но поскольку вы не назначаете новую строку чему-либо, новая строка теряется.
Как уже было сказано выше, строки неизменяемы.
Это означает, что когда вы выполняете замену, вы получаете новую строку, а не изменяете существующую строку.
Если вы не сохраните эту новую строку в переменной (например, в переменной, в качестве которой она была объявлена), ваша новая строка нигде не будет сохранена.
Почему "b+="FFF" работает, а b.replace - нет
Потому что оператор += присваивает результат обратно левому операнду, конечно. Это просто сокращение для b = b + "FFF";
.
Простой факт заключается в том, что вы не можете изменить ни одну строку в .Net. Для строк нет никаких методов экземпляра - вы должны всегда где-то присваивать результаты операции обратно строковой ссылке.
Почему не работает
stringA.Replace ("X", "Y")
?
Зачем мне делатьstringB = stringA.Replace ("X", "Y");
?
Потому что строки неизменяемы в .NET. Вы не можете изменить значение существующего строкового объекта, вы можете только создавать новые строки. string.Replace
создает новую строку, которую вы затем можете присвоить чему-либо, если хотите сохранить ссылку на нее. Из документации:
Возвращает новую строку , в которой все вхождения указанной строки в текущем экземпляре заменяются другой указанной строкой.
Акцент мой.
Итак, если строки неизменяемы, почему b + = "FFF"; работа?
Хороший вопрос.
Сначала обратите внимание, что b + = «FFF»;
эквивалентно b = b + «FFF»;
(за исключением того, что b вычисляется только один раз).
Выражение b + "FFF"
создает новую строку с правильным результатом без изменения старой строки. Ссылка на новую строку затем присваивается b
, заменяя ссылку на старую строку. Если нет других ссылок на старую строку, она станет пригодной для сборки мусора.
Да, это метод System.String. Но ты можешь попробовать a = a.Replace ("X", "Y");