C# 为什么可以';我是否重新初始化函数中的数组?
在C#中,数组通过引用传递给函数,这意味着此代码:C# 为什么可以';我是否重新初始化函数中的数组?,c#,arrays,pass-by-reference,pass-by-value,C#,Arrays,Pass By Reference,Pass By Value,在C#中,数组通过引用传递给函数,这意味着此代码: static void FillArray(int[] A) { for (int i = 0; i < A.Length; i++) { A[i] = -1; } } static void Main(string[] args) { int[] A = new int[10]; FillArray(A); Console.WriteLine(string.Join(
static void FillArray(int[] A) {
for (int i = 0; i < A.Length; i++) {
A[i] = -1;
}
}
static void Main(string[] args) {
int[] A = new int[10];
FillArray(A);
Console.WriteLine(string.Join(" ", A));
}
输出将是0 0 0 0 0 0
A
作为函数的引用传递后是否应该更改?您可以更改数组A
中包含的值,但不能更改A
。调用方法时,实际上传递了参数值的副本(默认情况下)。如果要更改A
,必须使用ref
关键字通过引用传递:
static void FillArray(ref int[] A) {
A = new int[2*A.Length];
for (int i = 0; i < A.Length; i++) {
A[i] = -1;
}
}
static void FillArray(ref int[]A){
A=新整数[2*A.Length];
for(int i=0;i
在内部,数组的地址就是要传递的地址。通过修改该数组中的项,调用者将看到这些更改。但是,如果将该数组分配给新数组,它将不再指向调用方的数组。调用方将看不到对该数组的任何更改
因此,当数组按引用传递时,引用本身按值传递,除非您使用
ref
关键字。当FillArray开始运行时,它有一个名为a的变量,该变量指向您在main中设置的数组(恰好称为a)
在第二种情况下,将本地数组更改为指向不同的数组。因此,调用代码看不到您所做的任何更改-2A变量之间没有关系
实际上,这不是“按引用”参数传递,因为更改传递的值(A)不会反映在调用方空间中。您将通过值获得一个“指针”(在引号中,因为c会认为它不是指针,因为托管代码没有指针)
a
是一个引用对象。但您正在按值传递引用对象@JonSkeet在这个int[]
上有一个引用类型,但是a
不是通过引用传递的。他们是两个不同的术语,许多人混淆了。术语“引用类型”是关于类型的。术语“通过引用传递”是关于变量的。通过将方法更改为:FillArray(ref int[]A)
,可以通过引用传递A
。开始阅读一些c文档的好时机。。。。。
static void FillArray(ref int[] A) {
A = new int[2*A.Length];
for (int i = 0; i < A.Length; i++) {
A[i] = -1;
}
}