.NETの関数に配列を渡して何かをしようとしていますが、少し混乱しています。配列は参照型であるため、関数に渡された配列に加えられた変更は、関数の外部に表示されます。例
static void Main(string[] args)
{
byte[] arr = new byte[] { 1,2, 3, 4, 5 };
Console.WriteLine(string.Join("", arr)); //console output: 12345
doSomething(arr);
Console.WriteLine(string.Join("", arr)); //console output: 52341
}
static void doSomething(byte[] array)
{
byte tmp = array[0];
array[0] = array[array.Length - 1];
array[array.Length - 1] = tmp;
}
したがって、「ref」キーワードを使用した場合とまったく同じように機能します(同じコンソール出力)
doSomething(ref arr); for static void doSomething(ref byte[] array)
ただし、関数に次の行を追加すると、次のようになります。
array = (new byte[] { 1 }).Concat(array).ToArray(); //size of array is changed
結果は異なります。
12345
52341// "ref" keyword is not used
と
12345
152341 "ref" keyword is used
結果が異なる理由を誰かに説明してもらえますか?