字符串值在方法调用时不会改变

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”,因此您会得到最终结果。

在每次操作后打印变量值是个好主意,这样您就可以真正知道哪个操作没有像预期的那样工作。

【讨论】:

以上是关于字符串值在方法调用时不会改变的主要内容,如果未能解决你的问题,请参考以下文章

Java - 方法调用后对象状态不会改变[重复]

以编程方式调用 ibaction 方法不会改变按钮的背景?

java中方法的重载与重写的区别

如何在字符串中添加 '#' 符号/表情符号,以便在调用 `split('#')` 方法时不会拆分字符串?

为啥这个函数调用后数组会改变? [复制]

java 类1