Jon Skeet said:
The callee can change the *contents* of the array.
No they don't. Do you have some sample code which makes you think they
do?
The book is called "C# for experienced programmers"
On page 127-130,
Using system;
...
public class ArrayReferenceTest : System.Windows.Forms.Form
{ ...
private void showOutputButton_Click(
object sender, System.EventArgs e)
{
int[] firstArray = { 1, 2, 3 };
int[] firstArrayCopy = firstArray;
outputLabel.Text = "Test passing firstArray reference by value";
outputLabel.Text = "\n\n Contents of firstArray " + "before
calling FirstDouble:\n\t";
for (int i = 0; i < firstArray.Length; i++)
outputLabel.Text += firstArray
+ " ";
FirstDouble (firstArray);
outputLabel.Text += "\n\nContents of firstArray after " + "calling
FirstDouble\n\t";
for (int i = 0; i < firstArray.Length; i++)
outputLabel.Text += firstArray + " ";
if ( firstArray == firstArrayCopy )
outputLabel.Text += "\n\nThe references refer to the same
array\n";
else
outputLabel.Text += "\n\nThe references refer to different
arrays\n";
int [] secondArray = { 1, 2, 3 };
int [] secondArrayCopy = secondArray;
outputLabel.Text += "\nTest passing secondArray " +
"reference by reference";
outputLabel.Text += "\nContents of secondArray " +
"before calling SecondDouble:\n\t";
for (int i = 0; i < secondArray.Length; i++ )
outputLabel.Text += secondArray + "\n";
SecondDouble (ref secondArray);
outputLabel.Text += "\n\nContents of secondArray " +
"after calling SecondDouble:\n\t";
for (int i = 0; i < secondArray.Length; i++)
outputLabel.Text += secondArray + " ";
if (secondArray == secondArrayCopy)
outputLabel.Text +=
"\n\nThe references refer to the same array\n";
else
outputLabel.Text +=
"\n\nThe references refer to different arrays\n";
}
void firstDouble (int [] array)
{
for (int i = 0; i < array.Length; i++)
array *= 2;
array = new int[] { 11, 12, 13 };
}
void SeondDouble (ref int[] array)
{
for (int i = 0; i < array.Length; i++)
array *= 2;
array = new int[] { 11, 12, 13 };
}
}
=================================
results:
Test passing firstArray reference by value
Contents of firstArray before calling FirstDouble
1 2 3
Contents of firstArray after calling FirstDouble
2 4 6
The references refer to the same array
Test passing secondArray reference by reference
Contents of secondArray before calling
SecondDouble:
1 2 3
Contents of secondArray after calling SecondDouble:
11 12 13
The references refer to different arrays
============================
Thanks
Jack
If you use ref, the callee can change which array the parameter refers
to, and that change will be made to the caller's variable too.
See
http://pobox.com/~skeet/csharp/parameters.html for more
information.
Jon