Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 配列のコピーとメモリ | 配列の操作とソート
C# 配列

配列のコピーとメモリ

メニューを表示するにはスワイプしてください

C#で配列を扱う際には、配列がメモリ上でどのように保存されているか、またコピーや代入を行ったときに何が起こるかを理解することが重要です。C#の配列は参照型であり、変数は配列データがメモリ上のどこに格納されているかを示す参照(またはポインタ)を保持します。実際のデータ自体を保持しているわけではありません。これにより、ある配列変数を別の変数に代入した場合や、配列の内容を本当にコピーしたい場合に大きな影響があります。これらの点を見落とすと、意図しない場所でデータが変更されてしまい、追跡が難しいバグにつながる可能性があります。

Program.cs

Program.cs

12345678910111213141516171819202122232425262728293031
namespace 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

Program.cs

1234567891011121314151617
namespace 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 のように、ある配列変数を別の変数に代入しても、新しい配列や要素のコピーは作成されません。代わりに、numbersshallow の両方の変数が同じメモリ上の配列を参照します。つまり、一方の変数を通じて行った変更は、もう一方の変数からも確認できます。

Note
定義

シャローコピーは配列への参照をコピーするため、両方の変数が同じメモリ位置を指します。ディープコピーは新しい配列を作成し、すべての要素をコピーするため、配列同士は独立します。

1. C#で1つの配列変数を別の配列変数に代入するとどうなりますか?

2. 配列の本当のコピーを作成するにはどうすればよいですか?

3. データを操作する際に配列のメモリを理解することが重要なのはなぜですか?

question mark

C#で1つの配列変数を別の配列変数に代入するとどうなりますか?

正しい答えを選んでください

question mark

配列の本当のコピーを作成するにはどうすればよいですか?

正しい答えを選んでください

question mark

データを操作する際に配列のメモリを理解することが重要なのはなぜですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  5

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 3.  5
some-alt