次の方法で共有


値型のパラメータの引き渡し (C# プログラミング ガイド)

更新 : 2007 年 11 月

参照型の変数はデータへの参照を持つのに対し、値型の変数はデータを直接格納します。このため、値型変数をメソッドに渡すことは、メソッドに変数のコピーを渡すことを意味します。メソッド内でパラメータが変更されても、変数に格納されている元のデータには影響しません。呼び出されたメソッドでパラメータの値を変更する場合は、ref キーワードまたは out キーワードを使用して、パラメータを参照で渡す必要があります。説明を簡単にするために、次の例では ref だけを使用しています。

使用例

値によって値型を渡す方法を次の例で示します。変数 n は、SquareIt メソッドに値で渡されます。メソッド内で変更があっても、元の変数値には影響しません。

class PassingValByVal
{
    static void SquareIt(int x)
    // The parameter x is passed by value.
    // Changes to x will not affect the original value of x.
    {
        x *= x;
        System.Console.WriteLine("The value inside the method: {0}", x);
    }
    static void Main()
    {
        int n = 5;
        System.Console.WriteLine("The value before calling the method: {0}", n);

        SquareIt(n);  // Passing the variable by value.
        System.Console.WriteLine("The value after calling the method: {0}", n);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    The value before calling the method: 5
    The value inside the method: 25
    The value after calling the method: 5
*/

値型の変数 n には、データ (値は 5) が格納されています。SquareIt が呼び出されると、n の内容がパラメータ x にコピーされ、値はメソッド内で 2 乗されます。ただし、Main では SquareIt メソッドの呼び出し前後で n の値は変わりません。実際、メソッド内での変更は、ローカル変数 x だけに影響します。

ref キーワードを使用してパラメータを渡すことを除けば、次の例は前の例と同じです。パラメータの値は、メソッドの呼び出し後に変更されています。

class PassingValByRef
{
    static void SquareIt(ref int x)
    // The parameter x is passed by reference.
    // Changes to x will affect the original value of x.
    {
        x *= x;
        System.Console.WriteLine("The value inside the method: {0}", x);
    }
    static void Main()
    {
        int n = 5;
        System.Console.WriteLine("The value before calling the method: {0}", n);

        SquareIt(ref n);  // Passing the variable by reference.
        System.Console.WriteLine("The value after calling the method: {0}", n);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    The value before calling the method: 5
    The value inside the method: 25
    The value after calling the method: 25
*/

この例では、n の値ではなく、n への参照が渡されています。パラメータ x は int ではなく、int への参照 (例では、n への参照) です。このため、メソッド内で x が 2 乗されると、x が参照している n が 2 乗されます。

渡されたパラメータの値を変更する例として一般的なのは、Swap メソッドです。このメソッドに x と y の 2 つの変数を渡すと、内容が交換されます。Swap メソッドにはパラメータを参照で渡す必要があります。参照で渡さないと、メソッド内ではパラメータのローカル コピーを処理することになります。参照のパラメータを使用する Swap メソッドの例を次に示します。

static void SwapByRef(ref int x, ref int y)
{
    int temp = x;
    x = y;
    y = temp;
}

このメソッドを呼び出すときは、ref キーワードを次のように使用します。

static void Main()
{
    int i = 2, j = 3;
    System.Console.WriteLine("i = {0}  j = {1}" , i, j);

    SwapByRef (ref i, ref j);

    System.Console.WriteLine("i = {0}  j = {1}" , i, j);

    // Keep the console window open in debug mode.
    System.Console.WriteLine("Press any key to exit.");
    System.Console.ReadKey();
}
/* Output:
    i = 2  j = 3
    i = 3  j = 2
*/

参照

概念

C# プログラミング ガイド

参照

パラメータの引き渡し (C# プログラミング ガイド)

参照型のパラメータの引き渡し (C# プログラミング ガイド)