为什么发送给函数的参数被更改

时间:2018-09-11 06:21:42

标签: c#

我记得在谈论函数传递参数时,据说参数不会在函数执行期间改变其值。但是在我的示例中,我观察到我的初始参数值发生了变化:

Fecha:

执行public static void main() { int[] a = new int[]{some int array}; int[] b = SortArray(a); Output(a); } internal static int[] SortArray(int[] a) { int[] c = new int[a.length]; //Sort process, during which, both c[] and a[] are changing return c; } 时,我发现我的Output(a);不再是原始版本了。这是什么把戏?

3 个答案:

答案 0 :(得分:6)

  

据说参数不会改变其值

是的*。您在这里感到困惑的原因可能是您误解了这里的“更改”的含义。

C#中的数组是引用类型。这意味着数组类型的变量并不存储数组本身,而是存储在内存中其他地方的对实际数组的引用。

a value 不是数组,而是引用。只要a指向同一个数组,我就可以说a的值不会改变。

在您的方法中,您可能执行了以下操作:

a[0] = <something else>;

这不会修改a的值。您正在修改实际的数组对象。修改a的值类似于:

a = new int[10]; // a now references a new array

这就是更改反映出来的原因-只有一个数组开始,参数a和局部变量a都引用该数组。


*实际上,如果您使用ref修饰符,则该参数的值可以更改,因为它是通过引用传递的。

答案 1 :(得分:0)

.NET中的数组是堆上的对象,因此您有一个引用。

该引用是按值传递的,调用方将看到对数组内容的正确更改,但不会重新分配数组

  

//排序过程,在此过程中,c []和a []都在改变

请勿更改a[x],问题已解决。

答案 2 :(得分:0)

应该是这样。您应该避免返回数组,只需将其作为引用/指针传递即可。还忘了所有有关Java数组声明(括号的顺序)的信息

public static void main()
{
    int a[] = {3,1,2};
    int* sorted = SortArray(a, a.length);
    Output(sorted);
    delete[] sorted;
}

internal static int* SortArray(int* a, int length)
{
    int* c = new int[length];
    //Sort process, during which, both c[] and a[] are changing
    return c;
}