7

ref と out を使用した配列の受け渡し (C# プログラミング ガイド)のページを読み、配列パラメーターが既に参照型であるのに、なぜ配列パラメーターを ref パラメーターとして定義する必要があるのか​​疑問に思いました。呼び出し先関数の変更は呼び出し元関数に反映されませんか?

4

2 に答える 2

5

配列の内容のみを変更する予定であれば、その通りです。ただし、配列自体を変更する場合は、参照渡しする必要があります。

例えば:

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.
}
于 2013-10-08T20:00:45.507 に答える