#c# #.net #string
Вопрос:
Я очень новичок в C# и следую некоторым учебным пособиям. Недавно у меня возникла проблема с манипулированием строками.
string myName = "Jhon"; myName = myName.ToUpper(); myName = myName.Replace("Jhon", "doe").ToUpper(); Console.WriteLine($"Hello {myName}"); Console.WriteLine($"Hello {myName}");
и ответ был таков:
Hello JHON Hello JHON
Почему строка Jhon не была заменена на doe ? и почему первый из них сработал, а последний-нет ?
Ответ №1:
Вы меняете значение myName
на верхний регистр с помощью функции во второй строке .ToUpper()
, преобразуя Jhon в JHON.
Затем на третьей строке вы пытаетесь заменить Джона на доу, но не забывайте, что вы только что превратили Джона в ДЖОНА!
.Replace()
Функция чувствительна к регистру и не найдет в вашей строке ничего подходящего для замены
Кроме того, если вы хотите отобразить myName
значение сразу после преобразования в верхний регистр, вам следует поместить Console.WriteLine($"Hello {myName}");
его между второй и третьей строками, потому что в противном случае вы снова измените значение, даже не отображая его в консоли
В конце ваш код может выглядеть так :
string myName = "Jhon"; myName = myName.ToUpper(); Console.WriteLine($"Hello {myName}"); myName = myName.Replace("JHON", "doe").ToUpper(); Console.WriteLine($"Hello {myName}");
Ответ №2:
После myName = myName.ToUpper();
того, как переменная myName равна «JHON», а строки чувствительны к регистру для метода Replace ().
Ответ №3:
Почему строка Jhon не была заменена на doe?
Потому что там было JHON
значение, а не из Jhon
-за ToUpper()
звонка и назначения.
Вы, наверное, хотели сделать что-то подобное
string myName = "Jhon"; string myName1 = myName.ToUpper(); string myName2 = myName.Replace("Jhon", "doe").ToUpper(); Console.WriteLine($"Hello {myName1}"); Console.WriteLine($"Hello {myName2}");
Комментарии:
1. Использование
var
if, если он начинает с C#, может быть не лучшей идеей, но это определенно сработает2. ты прав. .
Ответ №4:
Первый. Строки по самой своей природе неизменяемы в C#. Это означает, что вы никогда не сможете реально изменить существующую строку. Вы можете просто создать новую строку на основе старой.
Во-вторых: Пожалуйста, немного погуглите о передаче по значению против передачи по ссылке. Строка-это тип, который передается по ссылке. Это означает, что myName-это не блок символов, а ссылка на него.
Дело в том, что это похоже на чувака, у которого можно спросить, где что-то есть. Чувака зовут мое имя, и сначала вы говорите ему, что он должен указать на текст «Джон». Чем вы попросите компьютер написать новую строку в другом месте с Jhon в верхнем регистре, затем скажите чуваку myName, что отныне он должен указывать вам на эту новую строку.
Чем, наконец, вы просите myName привести вас к строке, на которую он указывает (после предыдущего шага), она указывает на значение «ДЖОН», чем вы просите компьютер заменить каждое вхождение «Джон» внутри «ДЖОНА» на «доу», поскольку замена чувствительна к регистру, она не находит никакого вхождения «Джон» внутри «ДЖОНА», поэтому вы получаете свой конечный результат.
Это действительно хорошая идея-печатать значения переменных после каждой операции, чтобы вы действительно знали, какая операция работает не так, как ожидалось.