C#:变量在处理时改变值

时间:2016-04-19 08:19:32

标签: c# .net

我的变量在处理时更改值。这是我的代码。

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"?

2 个答案:

答案 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”。