为何未直接修改array变量内部元素,其值却发生改变?
数组参数被意外修改的原因及修复方案
你遇到的问题核心在于C#中数组是引用类型,而非值类型。当执行int[] sortedArray = array;时,并没有创建新的数组副本,只是让sortedArray和传入的array指向内存中同一个数组实例。所以不管通过哪个变量修改数组元素,本质都是修改同一块内存里的数据——这就是原数组内容被意外改变的原因。
再看代码里的交换逻辑:
sortedArray[i] = array[i + 1]; sortedArray[i + 1] = array[i];
由于sortedArray和array指向同一个数组,修改sortedArray的元素时,array的对应元素也会同步变化,后续交换会基于已修改的值继续操作,最终导致原数组出现(1, 1, 1, 4, 4)这种异常结果。
修复步骤
- 创建原数组的独立副本,避免两个变量指向同一实例:
将int[] sortedArray = array;替换为以下任意一种方式:// 方式1:使用Clone方法 int[] sortedArray = (int[])array.Clone(); // 方式2:手动创建新数组并复制元素 int[] sortedArray = new int[array.Length]; Array.Copy(array, sortedArray, array.Length); - 修正交换逻辑,直接操作副本数组的元素,不再依赖原
array:if (sortedArray[i] > sortedArray[i + 1]) { // 用临时变量完成元素交换 int temp = sortedArray[i]; sortedArray[i] = sortedArray[i + 1]; sortedArray[i + 1] = temp; }
修改后的完整代码:
static int[] SortArray(int[] array) { // 创建原数组的独立副本 int[] sortedArray = (int[])array.Clone(); while (!IsSorted(sortedArray)) { for (int i = 0; i < sortedArray.Length - 1; i++) { if (sortedArray[i] > sortedArray[i + 1]) { int temp = sortedArray[i]; sortedArray[i] = sortedArray[i + 1]; sortedArray[i + 1] = temp; } } } return sortedArray; }
这样修改后,原数组内容不会被影响,只有sortedArray会被排序修改。
内容的提问来源于stack exchange,提问作者CoffeeQuest
相关产品推荐
相关产品推荐

