C# 传递 int[](数组)有和没有 ref

C# passing int[] (array) with and without ref

对此我有点疑惑,因为我看过一个int[]数组,虽然int是原始类型,但既然是数组,就是引用类型变量。

方法之间有什么不同,例如:

public static void ChangeSomething(ref int[] array)
{
     array[0] = 100;
}

public static void ChangeSomething(int[] array)
{
     array[0] = 100;
}

修改数组后,我可以在这两个调用的索引 0 处看到新值 100。

在幕后是否发生了一些不同的事情,使一个人比另一个人更好? VS IDE 是否仅因为 "ref" 关键字阐明了意图而允许两者?

不同的是,你可以直接在方法中给原始变量赋值。如果您将方法更改为:

public static void ChangeSomething(ref int[] array)
{
     array = new int[2];
}

并这样称呼它:

var myArray = new int[10];
ChangeSomething(ref myArray);

Console.WriteLine(array.Length);

调用后你会看到myArray的长度只有2。如果没有 ref 关键字,您只能更改数组的内容,因为数组的引用已复制到方法中。

如果修改数组的项,没有区别。

但是如果你用更大的数组重新定义数组本身,就会有区别:

public static void ChangeSomething(ref int[] array)
{
     array = new int[100]; //you are changing the variable of caller
}

public static void ChangeSomething(int[] array)
{
     array = new int[100]; //you are changing local copy of array variable, the caller array remains same.
}