Строковое значение не изменяется при вызове метода

#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 привести вас к строке, на которую он указывает (после предыдущего шага), она указывает на значение «ДЖОН», чем вы просите компьютер заменить каждое вхождение «Джон» внутри «ДЖОНА» на «доу», поскольку замена чувствительна к регистру, она не находит никакого вхождения «Джон» внутри «ДЖОНА», поэтому вы получаете свой конечный результат.

Это действительно хорошая идея-печатать значения переменных после каждой операции, чтобы вы действительно знали, какая операция работает не так, как ожидалось.