我记得在谈论函数传递参数时,据说参数不会在函数执行期间改变其值。但是在我的示例中,我观察到我的初始参数值发生了变化:
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);
不再是原始版本了。这是什么把戏?
答案 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;
}