为什么 ref 会用于 C# 中的数组参数

本文关键字:数组 参数 ref 用于 为什么 | 更新日期: 2023-09-27 18:34:31

我阅读了使用 ref 和 out 传递数组(C# 编程指南(页面,想知道为什么我们需要将数组参数定义为 ref 参数,而它已经是引用类型。被调用方函数中的更改不会反映在调用方函数中吗?

为什么 ref 会用于 C# 中的数组参数

被调用方函数

中的更改不会反映在调用方函数中吗?

对数组内容的更改将反映在调用者方法中 - 但对参数本身的更改不会。所以例如:

public void Foo(int[] x)
{
    // The effect of this line is visible to the caller
    x[0] = 10;
    // This line is pointless
    x = new int[] { 20 };
}
...
int[] original = new int[10];
Foo(original);
Console.WriteLine(original[0]); // Prints 10

现在,如果我们Foo更改为具有以下签名:

public void Foo(ref int[] x)

并将调用代码更改为:

Foo(ref original);

然后它会打印 20。

了解变量与其值所指的对象之间的区别非常重要 - 同样,修改对象和修改变量之间的区别也是如此。

有关详细信息,请参阅我关于 C# 中的参数传递的文章。

如果您只打算更改数组的内容,那么您是正确的。 但是,如果您计划更改数组本身,则必须通过引用传递。

例如:

void foo(int[] array)
{
  array[0] = 5;
}
void bar(int[] array)
{
  array = new int[5];
  array[0] = 6;
}
void barWithRef(ref int[] array)
{
  array = new int[6];
  array[0] = 6;
}

void Main()
{
  int[] array = int[5];
  array[0] = 1;
  // First, lets call the foo() function.
  // This does exactly as you would expect... it will
  // change the first element to 5.
  foo(array);
  Console.WriteLine(array[0]); // yields 5
  // Now lets call the bar() function.
  // This will change the array in bar(), but not here.
  bar(array);
  Console.WriteLine(array[0]); // yields 1.  The array we have here was never changed.
  // Finally, lets use the ref keyword.
  barWithRef(ref array);
  Console.WriteLine(array[0]); // yields 5.  And the array's length is now 6.
}