C#传递int[](数组)带和不带ref

C#传递int[](数组)带和不带ref,c#,arrays,primitive,C#,Arrays,Primitive,我对此有点困惑,因为我已经读到int[]数组,尽管int是一个基本类型,但因为它是数组,所以它是一个引用类型变量 那么,以下方法之间的区别是什么: public static void ChangeSomething(ref int[] array) { array[0] = 100; } 及 修改数组后,我可以在索引0处看到这两个调用的新值100 有什么不同的事情发生在封面下,使一个比另一个更好?VS IDE是否仅因为“ref”关键字澄清了意图而允许这两种方法?区别在于您可以直接在

我对此有点困惑,因为我已经读到int[]数组,尽管int是一个基本类型,但因为它是数组,所以它是一个引用类型变量

那么,以下方法之间的区别是什么:

public static void ChangeSomething(ref 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[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(ref int[] array)
{
     array = new int[100]; //you are changing the variable of caller
}