配列のコピーとメモリ
メニューを表示するにはスワイプしてください
C#で配列を扱う際には、配列がメモリ上でどのように保存されているか、またコピーや代入を行ったときに何が起こるかを理解することが重要です。C#の配列は参照型であり、変数は配列データがメモリ上のどこに格納されているかを示す参照(またはポインタ)を保持します。実際のデータ自体を保持しているわけではありません。これにより、ある配列変数を別の変数に代入した場合や、配列の内容を本当にコピーしたい場合に大きな影響があります。これらの点を見落とすと、意図しない場所でデータが変更されてしまい、追跡が難しいバグにつながる可能性があります。
Program.cs
12345678910111213141516171819202122232425262728293031namespace ConsoleApp { public class Program { public static void Main(string[] args) { int[] original = { 1, 2, 3, 4, 5 }; // Assigning the array reference int[] assigned = original; // Copying the array elements int[] copied = new int[original.Length]; for (int i = 0; i < original.Length; i++) { copied[i] = original[i]; } // Modify the assigned array assigned[0] = 99; // Modify the copied array copied[1] = 77; System.Console.WriteLine("original: " + string.Join(", ", original)); System.Console.WriteLine("assigned: " + string.Join(", ", assigned)); System.Console.WriteLine("copied: " + string.Join(", ", copied)); } } }
ある配列変数を別の変数に代入すると、両方の変数は同じメモリ領域を指します。つまり、一方の変数を通じて行った変更は、もう一方にも反映されます。これは、両方が同じ配列への参照であるためです。これを避けたい場合は、上記のコードのように各要素を新しい配列にコピーする必要があります。これにより、メモリ上に新しい配列が作成され、一方の配列に対する変更がもう一方に影響しなくなります。
ここで、**浅いコピー(shallow copy)と深いコピー(deep copy)**という概念が登場します。浅いコピーは配列への参照だけをコピーし、実際の要素はコピーしません。深いコピーは新しい配列を作成し、各要素をコピーすることで、2つの独立した配列を作成します。
Program.cs
1234567891011121314151617namespace ConsoleApp { public class Program { public static void Main(string[] args) { int[] numbers = { 10, 20, 30 }; int[] shallow = numbers; shallow[1] = 99; System.Console.WriteLine("numbers: " + string.Join(", ", numbers)); System.Console.WriteLine("shallow: " + string.Join(", ", shallow)); } } }
このコードサンプルは、C#で配列のシャローコピーを実行した場合に何が起こるかを示しています。int[] shallow = numbers のように、ある配列変数を別の変数に代入しても、新しい配列や要素のコピーは作成されません。代わりに、numbers と shallow の両方の変数が同じメモリ上の配列を参照します。つまり、一方の変数を通じて行った変更は、もう一方の変数からも確認できます。
シャローコピーは配列への参照をコピーするため、両方の変数が同じメモリ位置を指します。ディープコピーは新しい配列を作成し、すべての要素をコピーするため、配列同士は独立します。
1. C#で1つの配列変数を別の配列変数に代入するとどうなりますか?
2. 配列の本当のコピーを作成するにはどうすればよいですか?
3. データを操作する際に配列のメモリを理解することが重要なのはなぜですか?
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください