【问题标题】:Using concatenate to redefine an already defined string使用连接重新定义已定义的字符串
【发布时间】:2019-08-03 09:58:53
【问题描述】:

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

var stringOfNames = "";
var arrayOfNames = new string[5] { "jack", "marry", "joe", "jimmy", "bud" };

foreach (var item in arrayOfNames)
{
    stringOfNames += item;
    Console.WriteLine(stringOfNames);

}

预期:

错误声明“变量已在此范围内定义。”

实际:

通过添加其他名称来更改字符串。

还有,这两者有什么区别:

1)

var a = "something";
var a = "something else";

2)

var a = "something";
a+= "asdf";

为什么第二个选项有效?

【问题讨论】:

  • 这是正确的行为。为什么你会期待那个错误信息?这里没有重新定义。只需在每个循环中,字符串引用 stringOfName 将设置为不同的字符串引用,但变量仍然相同。

标签: c#


【解决方案1】:

但是在这个foreach循环中,字符串被改变了

不,不是。

变量 改变值,在每次迭代时引用不同的字符串。每个有问题的字符串对象 - 数组中的原始对象和中间结果 - 都保留与之前相同的数据。

这是另一种证明方式:

string x = "ab";
string y = x;
x += "cd";

Console.WriteLine(x); // abcd
Console.WriteLine(y); // ab

这里x 的值更改为引用一个新字符串,但y 的值仍然引用原始字符串"ab"

基本上你需要非常清楚三个独立的概念:

  • 变量:存储值的命名存储位置
  • References:一种值,指的是一个对象。
  • 对象本身

我有一个answer on another question,这可能有助于澄清差异。

【讨论】:

    【解决方案2】:

    stringOfNames += item; 没有定义变量stringOfNames,它为其赋值

    【讨论】:

    • 实际上它为它分配了一个对象——这正是 OP 所面临的问题——认为对象中的值已更改。正如乔恩的回答所示,原始对象仍然存在。
    猜你喜欢
    • 2012-01-27
    • 2019-10-06
    • 2014-12-05
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2015-03-26
    相关资源
    最近更新 更多