C#入門ノート -- 配列:配列のシャローコピー、refの戻り値とrefローカル変数

1、Clone()メソッド

Cloneメソッドは配列に対してシャローコピーを実行します。

  • 配列自体のみが複製されます。

  • 参照型の配列の場合、要素の参照先オブジェクトは複製されません。

  • 値型と参照型の配列では結果が異なります。

    • 値型配列のクローンは、独立した2つの配列を作成します。
    • 参照型配列のクローンは、同じオブジェクトを指す2つの配列を作成します。
  • Cloneメソッドはobject型の参照を返すため、適切な型変換が必要です。

int[] sourceArray = {1, 2, 3};
int[] clonedArray = (int[]) sourceArray.Clone();
例1:値型配列のクローン
static void Main(string[] args)
{
    int[] sourceArray = { 1, 2, 3 };
    int[] clonedArray = (int[])sourceArray.Clone();
​
    for (int i = 0; i < clonedArray.GetLength(0); i++)
    {
        clonedArray[i] = i * 100;
    }
}
例2:参照型配列のクローン
static void Main(string[] args)
{
    A[] originalArray = new A[3] { new A(), new A() , new A() };
    A[] clonedArray = (A[]) originalArray.Clone();
​
    for (int i = 0; i < clonedArray.GetLength(0); i++)
    {
        clonedArray[i].Value = (i+1) * 100;
    }
    Printer.PrintArrays13Clone(originalArray);  //100 200 300
    Printer.PrintArrays13Clone(clonedArray);  //100 200 300
}

2、refの戻り値とrefローカル変数

  • refの戻り値により、メソッドから参照を外部に返すことができます。
  • refローカル変数を使用することで、呼び出し元でその参照を利用できます。

refの戻り値とrefローカル変数を活用すると、配列内の特定要素への参照を取得して操作できるようになり、その値ではなく参照そのものを利用できます

public static ref int GetReferenceToLargestElement(int[] numbers)
{
    int maxIndex = 0;
    int maxValue = numbers[0];
    for (int i = 0; i < numbers.Length; i++)
    {
        if (numbers[i] > maxValue)
        {
            maxValue = numbers[i];
            maxIndex = i;
        }
    }
    return ref numbers[maxIndex];
}
static void Main(string[] args)
{
    int[] values = new int[] { 5, 80 };
    Console.WriteLine("変更前"); //5 80
    foreach (var value in values)
    {
        Console.Write($"{value} ");
    }
    Console.WriteLine("\n変更後"); //5 0
    ref int largestElement = ref Program1314.GetReferenceToLargestElement(values);
    largestElement = 0; //最大値を変更
    foreach (var value in values)
    {
        Console.Write($"{value} ");
    }
}
//5 80
//5 0

タグ: C# 配列 クローン ref ローカル変数

5月13日 17:39 投稿