Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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中更改一个数组会更改另一个数组?_C# - Fatal编程技术网

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

C# 为什么在C中更改一个数组会更改另一个数组?,c#,C#,我有一个二维数组,即C中的状态。我从状态构建一个一维数组,即子状态。当我更改子状态时,状态也会更改。我希望国家保持不变。谢谢 int[] SubState = State [0]; SubState[0]-=1; //State[0][0] is also changed here 您不是在构建新的一维数组。您只需创建对二维数组第一行的新引用。如果您确实想要构建一个新的一维数组,那么必须迭代地复制二维数组的第一行 尝试: 显然,状态0处的元素是一个int数组,它是一个引用类型。因此,SubSt

我有一个二维数组,即C中的状态。我从状态构建一个一维数组,即子状态。当我更改子状态时,状态也会更改。我希望国家保持不变。谢谢

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

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

尝试:


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

编辑:Thius假设子状态已初始化为与状态相同的大小。e、 g:

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

您可能想做的是从状态数组中创建一个单独的数组,如

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

在我看来,你的州定义是:

int[][] State;
数组是一种引用类型,当您从状态数组复制一个元素时,您会从第一个列表中获得对该数组的引用,并且两个引用都映射到同一个int[]数组。所以,当您更改存储在子数组中的数组时,您将使用指向同一数组的链接

简单修复程序是源阵列的副本

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

int[] SubState = State [0];
试一试


因此,您不是简单地分配一个新引用,而是实际上正确地复制了数组,这是因为当您分配数组时,您传递了它的引用,而不是复制它。查看阵列复制方法上的msdn链接

感谢大家提供的非常有用的意见。
int[][] State;
var SubState = State[0].ToArray();
int[] SubState = State [0];
int[] SubState = new int[State[0].Length];
Array.Copy(State[0],Substate, Substate.Length)