字符串值在方法调用时不会改变
Posted
技术标签:
【中文标题】字符串值在方法调用时不会改变【英文标题】:String value does not change on method calling 【发布时间】:2021-11-25 12:55:32 【问题描述】:我是 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】:您使用第二行中的函数.ToUpper()
将myName
的值更改为大写,将Jhon 转换为JHON。
然后在第三行尝试将 Jhon 替换为 doe,但不要忘记您只是将 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 替换?
因为ToUpper()
调用和分配导致JHON
值而不是Jhon
。
你可能想做这样的事情
string myName = "Jhon";
string myName1 = myName.ToUpper();
string myName2 = myName.Replace("Jhon", "doe").ToUpper();
Console.WriteLine($"Hello myName1");
Console.WriteLine($"Hello myName2");
【讨论】:
如果他从 C# 开始,使用var
可能不是最好的主意,但它肯定会工作
你是对的。 .【参考方案4】:
首先。字符串本质上在 C# 中是不可变的。这意味着您永远无法真正更改现有字符串。您可以简单地在旧字符串的基础上创建一个新字符串。
其次:请谷歌一下关于按值传递与传递作为参考的信息。 String 是通过引用传递的类型。这意味着 myName 不是一个字符块,它是对它的引用。
这就像一个你可以问某物在哪里的家伙。这个家伙的名字是 myName,首先你告诉他他应该指向“Jhon”文本。比你要求计算机在不同的地方写一个新的字符串,Jhon 是大写的,然后告诉花花公子 myName 从现在开始他应该把你指向那个新的字符串。
最后你让 myName 引导你到它指向的字符串(在上一步之后)它指向值“JOHN”,而不是你要求计算机将“JOHN”中每次出现的“John”替换为“doe”,因为替换区分大小写,它不会在“JOHN”中找到任何出现的“John”,因此您会得到最终结果。
在每次操作后打印变量值是个好主意,这样您就可以真正知道哪个操作没有像预期的那样工作。
【讨论】:
以上是关于字符串值在方法调用时不会改变的主要内容,如果未能解决你的问题,请参考以下文章