Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';我是否重新初始化函数中的数组?_C#_Arrays_Pass By Reference_Pass By Value - Fatal编程技术网

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(

在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(" ", 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;
    }
}