C# 使用“连接”重新定义已定义的字符串
我知道字符串是不可变的,不能重新定义,但是在这个foreach循环中,通过添加数组元素,字符串被多次更改C# 使用“连接”重新定义已定义的字符串,c#,C#,我知道字符串是不可变的,不能重新定义,但是在这个foreach循环中,通过添加数组元素,字符串被多次更改 var stringOfNames = ""; var arrayOfNames = new string[5] { "jack", "marry", "joe", "jimmy", "bud" }; foreach (var item in arrayOfNames) { stringOfNames += item; Console.WriteLine(stringOfN
var stringOfNames = "";
var arrayOfNames = new string[5] { "jack", "marry", "joe", "jimmy", "bud" };
foreach (var item in arrayOfNames)
{
stringOfNames += item;
Console.WriteLine(stringOfNames);
}
预期:
声明“此范围中已定义变量”的错误
实际:
通过添加其他名称来更改字符串
还有,这两者之间的区别是什么:
(一)
(二)
为什么第二个选项有效?
stringOfNames+=item
不定义变量stringOfNames
,而是为其赋值
但是在这个foreach循环中,字符串被改变了
不,不是
变量更改值,以在每次迭代中引用不同的字符串。所讨论的每个字符串对象(包括数组中的原始对象和中间结果)都与以前的数据相同
这里有另一种方式来证明:
string x = "ab";
string y = x;
x += "cd";
Console.WriteLine(x); // abcd
Console.WriteLine(y); // ab
此处x
的值更改为引用新字符串,但y
的值仍然引用原始字符串“ab”
基本上,您需要非常清楚三个不同的概念:
- 变量:存储值的命名存储位置
- 引用:一种引用对象的值
- 对象本身
我有一个可能有助于澄清差异的建议。这是正确的行为。你为什么期待那个错误消息?这里没有重新定义。简单地说,在每个循环中,字符串引用stringOfName将被设置为不同的字符串引用,但变量仍然是相同的。实际上,它为其分配了一个对象--这正是OP所面临的问题--认为对象中的值已更改。正如乔恩的回答所示,原始物体仍然存在。
var a = "something";
a+= "asdf";
string x = "ab";
string y = x;
x += "cd";
Console.WriteLine(x); // abcd
Console.WriteLine(y); // ab