参照型パラメーターの引き渡し (C# プログラミング ガイド)Passing Reference-Type Parameters (C# Programming Guide)

型参照の変数には、そのデータは直接含まれず、そのデータへの参照が含まれます。A variable of a reference type does not contain its data directly; it contains a reference to its data. 値で参照型パラメーターを渡す場合、クラス メンバーの値など、参照先オブジェクトに属するデータを変更することができます。When you pass a reference-type parameter by value, it is possible to change the data belonging to the referenced object, such as the value of a class member. ただし、参照自体の値を変更することはできません。たとえば、同じ参照を使用して、新しいクラスのメモリを割り当て、ブロックの外側で永続化させることはできません。However, you cannot change the value of the reference itself; for example, you cannot use the same reference to allocate memory for a new class and have it persist outside the method. これを行うには、ref または out キーワードを使用してパラメーターを渡します。To do that, pass the parameter using the ref or out keyword. わかりやすくするために、次の例では ref を使用しています。For simplicity, the following examples use ref.

値渡しによる参照型の引き渡しPassing Reference Types by Value

次の例では、参照型のパラメーター arr を値渡しで Change メソッドに渡す方法について説明します。The following example demonstrates passing a reference-type parameter, arr, by value, to a method, Change. このパラメーターは arr への参照であるため、配列要素の値を変更できます。Because the parameter is a reference to arr, it is possible to change the values of the array elements. ただし、別のメモリ位置へのパラメーターの再割り当ては、メソッドの内部でのみ機能し、元の変数 arr には影響しません。However, the attempt to reassign the parameter to a different memory location only works inside the method and does not affect the original variable, arr.

class PassingRefByVal 
{
    static void Change(int[] pArray)
    {
        pArray[0] = 888;  // This change affects the original element.
        pArray = new int[5] {-3, -1, -2, -3, -4};   // This change is local.
        System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
    }

    static void Main() 
    {
        int[] arr = {1, 4, 5};
        System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr [0]);

        Change(arr);
        System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr [0]);
    }
}
/* Output:
    Inside Main, before calling the method, the first element is: 1
    Inside the method, the first element is: -3
    Inside Main, after calling the method, the first element is: 888
*/

前の例では、ref パラメーターなしで参照型の配列 arr がメソッドに渡されています。In the preceding example, the array, arr, which is a reference type, is passed to the method without the ref parameter. このような場合は、arr を指す参照のコピーがメソッドに渡されます。In such a case, a copy of the reference, which points to arr, is passed to the method. 出力は、メソッドが配列要素のコンテンツを変更できることを示しています。この場合は 1 から 888 に変更します。The output shows that it is possible for the method to change the contents of an array element, in this case from 1 to 888. ただし、Change メソッド内で new 演算子を使用して新しいメモリ領域を割り当てると、変数 pArray が新しい配列を参照します。However, allocating a new portion of memory by using the new operator inside the Change method makes the variable pArray reference a new array. このため、この後のすべての変更が、Main の内部で作成される元の配列 arr に影響しません。Thus, any changes after that will not affect the original array, arr, which is created inside Main. 実際、この例では、2 つの配列が作成されます。1 つは Main の内部で、もう 1 つは Change メソッド内で作成されます。In fact, two arrays are created in this example, one inside Main and one inside the Change method.

参照渡しによる参照型の引き渡しPassing Reference Types by Reference

次の例は、前の例と同じですが、ref キーワードがメソッド ヘッダーと呼び出しに追加されている点が異なります。The following example is the same as the previous example, except that the ref keyword is added to the method header and call. メソッドで行われるすべての変更が、呼び出し元のプログラム内の元の変数に影響します。Any changes that take place in the method affect the original variable in the calling program.

class PassingRefByRef 
{
    static void Change(ref int[] pArray)
    {
        // Both of the following changes will affect the original variables:
        pArray[0] = 888;
        pArray = new int[5] {-3, -1, -2, -3, -4};
        System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
    }
        
    static void Main() 
    {
        int[] arr = {1, 4, 5};
        System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr[0]);

        Change(ref arr);
        System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr[0]);
    }
}
/* Output:
    Inside Main, before calling the method, the first element is: 1
    Inside the method, the first element is: -3
    Inside Main, after calling the method, the first element is: -3
*/

メソッド内で行われるすべての変更は、Main の元の配列に影響します。All of the changes that take place inside the method affect the original array in Main. 実際、元の配列は new 演算子を使用して再割り当てされます。In fact, the original array is reallocated using the new operator. したがって、Change メソッドを呼び出した後、arr へのすべての参照が、Change メソッドで作成された 5 つの要素を持つ配列を指します。Thus, after calling the Change method, any reference to arr points to the five-element array, which is created in the Change method.

2 つの文字列のスワップSwapping Two Strings

文字列のスワップは、参照渡しで参照型パラメーターを渡す良い例です。Swapping strings is a good example of passing reference-type parameters by reference. 例では、2 つの文字列 str1str2Main で初期化され、ref キーワードで変更されたパラメーターとして SwapStrings メソッドに渡されます。In the example, two strings, str1 and str2, are initialized in Main and passed to the SwapStrings method as parameters modified by the ref keyword. 2 つの文字列は、メソッド内と Main 内でスワップされます。The two strings are swapped inside the method and inside Main as well.

 class SwappingStrings
 {
     static void SwapStrings(ref string s1, ref string s2)
     // The string parameter is passed by reference.
     // Any changes on parameters will affect the original variables.
     {
         string temp = s1;
         s1 = s2;
         s2 = temp;
         System.Console.WriteLine("Inside the method: {0} {1}", s1, s2);
     }

     static void Main()
     {
         string str1 = "John";
         string str2 = "Smith";
         System.Console.WriteLine("Inside Main, before swapping: {0} {1}", str1, str2);

         SwapStrings(ref str1, ref str2);   // Passing strings by reference
         System.Console.WriteLine("Inside Main, after swapping: {0} {1}", str1, str2);
     }
 }
 /* Output:
     Inside Main, before swapping: John Smith
     Inside the method: Smith John
     Inside Main, after swapping: Smith John
*/

この例では、呼び出し元のプログラム内の変数に影響を与えるため、参照渡しでパラメーターを渡す必要があります。In this example, the parameters need to be passed by reference to affect the variables in the calling program. メソッド ヘッダーと、メソッドの呼び出しの両方から ref キーワードを削除すると、呼び出し元プログラムで変更は行われません。If you remove the ref keyword from both the method header and the method call, no changes will take place in the calling program.

文字列の詳細については、「文字列」を参照してください。For more information about strings, see string.

参照See Also

C# プログラミング ガイドC# Programming Guide
パラメーターの引き渡しPassing Parameters
ref と out を使用した配列の引き渡しPassing Arrays Using ref and out
refref
inin
outout
参照型Reference Types