You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何未直接修改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)这种异常结果。

修复步骤

  1. 创建原数组的独立副本,避免两个变量指向同一实例:
    将int[] sortedArray = array;替换为以下任意一种方式:
    // 方式1:使用Clone方法
    int[] sortedArray = (int[])array.Clone();
    // 方式2:手动创建新数组并复制元素
    int[] sortedArray = new int[array.Length];
    Array.Copy(array, sortedArray, array.Length);
    
  2. 修正交换逻辑,直接操作副本数组的元素,不再依赖原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:25:36