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