Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用“连接”重新定义已定义的字符串_C# - Fatal编程技术网

C# 使用“连接”重新定义已定义的字符串

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

我知道字符串是不可变的,不能重新定义,但是在这个foreach循环中,通过添加数组元素,字符串被多次更改

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