最初のケースでAdd
は x + y を返します。2 番目のケースでAdd
は 20 + 40 を返します。
関数内で値を代入すると、変数のローカルコピーが変更されます。実際の値ではありません。
例えば:
using System;
class Program
{
static void Main(string[] args)
{
int x = 2;
int y = 20;
Console.WriteLine(Add(x, y));
// x is still 2, y is still 20
}
static int Add(int x, int y)
{
int ans = x + y;
// You calculate the parameters and store it in the local variable
x = 20;
y = 40;
// You've adapted your local COPIES of the variables
return ans;
// You return the answer which was calculated earlier
}
}
struct
ただし、これは値型 ( )を扱っているためです。参照型 ( ) を扱っている場合はclass
、別の問題です。たとえば、次のようになります。
using System;
class Program
{
private class Numbers
{
public int X;
public int Y;
}
static void Main(string[] args)
{
Numbers num = new Numbers();
num.x = 2;
num.y = 20;
Console.WriteLine(Add(num)); // Prints 2 + 20 = 22
// num.x is now 20, and num.y is now 40
Console.WriteLine(Add(num)); // Prints 20 + 40 = 60
}
static int Add(Numbers num)
{
int ans = num.x + num.y;
// You calculate the result from the public variables of the class
num.x = 20;
num.y = 40;
// You change the values of the class
return ans;
// You return the answer which was calculated earlier
}
}
C# には、パラメーターを渡す 4 つの「タイプ」があります。
- 値型 ( ) を値で渡す
struct
。
class
参照型 ( ) を値で渡す。
- 参照による値の型の受け渡し。
- 参照による参照型の受け渡し。
これら 4 を示す短い例:
static void Main()
{
int x = 5; // Value type
List<int> list = new List<int>(new [] { 1, 2, 3 }); // Reference type
ValueByValue(x); // x is still 5
ReferenceByValue(list) // list still contains { 1, 2, 3 }
ValueByReference(ref x); // x is now 10
ReferenceByReference(ref list); // list is now a new list containing only { 4, 5, 6 }
}
static void ValueByValue(int x)
{
x = 10; // Changes local COPY of x
}
static void ReferenceByValue(List<int> list)
{
list = new List<int>(new [] { 4, 5, 6 }); // Changes local COPY of list
}
static void ValueByReference(ref int x)
{
x = 10; // Changes the actual x variable in the Main method
}
static void ReferenceByReference(ref List<int> list)
{
list = new List<int>(new [] { 4, 5, 6 }); // Changes the actual list in the Main method
}