我的变量在处理时更改值。这是我的代码。
private string[] rawLayer;
private string[] lastRawLayer;
public bool getDisplayMessage(string message)
{
lastRawLayer = rawLayer;
rawLayer[0] = "1";
Console.WriteLine(lastRawLayer[0]); //Output = "1"
return true;
}
为什么我的输出" 1"?
答案 0 :(得分:4)
调用lastRawLayer = rawLayer;
时,只需添加对数组rawLayer
的新引用,而不是创建新数组。因此,对rawLAyer
所做的每项更改都会反映在lastRawLayer
内,反之亦然。如果您想要制作阵列的深层副本,则必须重新创建它:
lastRawLayer = rawLayer.ToArray();
另外使用Array.CopyTo
:
rawLayer.CopyTo(lastRawLayer, 0);
将rawLayer
的每个元素复制到第二个数组。但是,如果您在阵列中存储了一些自定义对象,则还必须重新创建这些对象,如果您想避免例如在索引为零的实例更改反映在两个数组中。所以以下情况仍然如此:
Person[] arr1 = new [] { new Person { Name = "Tim" } }
Person[] arr2 = new Person[arr.Length];
arr1.CopyTo(arr2);
arr1[0].Name = "Hans"; // this changes the value for all references to "Tim"
Console.WriteLine(arr2[0].Name);
上面的代码将打印" Hans"而不是"蒂姆"因为虽然您有不同的数组,但这些数组引用Person
的实例。
答案 1 :(得分:0)
您已为变量lastRawLayer分配了相同的引用。
lastRawLayer = rawLayer;
这意味着变量rawLayer指向的任何对象,lastRawLayer将指向同一个对象。因此,当您使用引用变量lastRawLayer访问对象时,它在内存中具有相同的对象,并且为什么您获得输出“1”。