为什么更改一个数组会改变C#中的另一个数组?

我有一个二维数组,即C#中的状态。 我从各州建立一个一维数组,即SubState。 当我改变SubState时,状态也会改变。 我希望各国不变。 谢谢

int[] SubState = State [0]; SubState[0]-=1; //State[0][0] is also changed here 

在我看来,你的国家定义是:

 int[][] State; 

Array是一种引用类型,当您从State数组复制元素时,您将从第一个列表中获取对该数组的引用,并且这两个引用都映射到相同的int []数组。 因此,当您更改存储在SubArray中的数组时,您可以使用指向同一数组的链接。

简单的修复是源数组的副本

 var SubState = State[0].ToArray(); 

那是因为当您分配数组时,您传递了它的引用,而不是复制它。 查看数组复制方法上的msdn链接https://msdn.microsoft.com/en-us/library/System.Array.Copy(v=vs.110).aspx

int[] SubState = State [0]; 只是对state数组的另一个引用,因此也可以通过它进行更改。

您可能想要做的是从state数组创建一个单独的数组

 int[] substate = new int[state.GetLength(0)]; state.CopyTo(substate, 0); 

您没有构建新的一维数组。 您只是创建对二维数组的第一行的新引用。 如果您确实想要构建一个新的一维数组,则必须迭代地复制二维数组的第一行。

尝试:

 int[] SubState = new int[States[0].length]; States[0].CopyTo(SubState, 0); 

代替

 int[] SubState = State [0]; 

尝试

 int[] SubState = new int[State[0].Length]; Array.Copy(State[0],Substate, Substate.Length) 

所以你不是简单地分配一个新的引用,而是实际上正确地复制数组

显然, State位置0处的元素是一个int数组,它是一个引用类型。 因此, SubStateState引用相同的数组,这就是为什么两个元素都会反映对它们的任何元素的更改。 要解决此问题,您可以创建State SubState副本并将其值复制到SubState

 States.CopyTo(SubStates, 0); 

编辑:Thius假设SubStates已经初始化为与States相同的大小。 例如:

 int[] SubStates = new int[States[0].Length];