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.
}
对此我有点疑惑,因为我看过一个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.
}