1. ホーム
  2. c#

[解決済み] コピーとクローンの違いは何ですか?

2022-02-28 14:14:52

質問

プログラミングでこれに関する決定的なリファレンスはあるのでしょうか?

ディープコピーとクローンを同じものとして言及する人を多く見かけます。 これは本当でしょうか?

言語依存なのでしょうか?

小さなことですが、気になったので...。

解決方法は?

そうですね、違いがありますね。言語依存性ですが、Shallow, Deep, Lazyのすべてのコピーができる言語もあります。Shallowコピーしかできない言語もあります。ですから、時には言語に依存することもあります。

では、たとえば配列の場合です。

int [] numbers = { 2, 3, 4, 5};
int [] numbersCopy = numbers;

numbersCopy」配列には同じ値が含まれていますが、より重要なのは、配列オブジェクト自体が「numbers」配列と同じオブジェクト参照を指していることです。

だから、もし私が次のようなことをしたら

  numbersCopy[2] = 0;

次の文はどのような出力になるでしょうか?

  System.out.println(numbers[2]);

  System.out.println(numbersCopy[2]);

両方の配列が同じ参照を指すと考えると、次のようになります。

0

0

しかし、もし最初の配列のコピーを独自の参照で作成したい場合はどうしたらよいでしょうか?その場合は、配列のクローンを作成します。そうすることで、各配列は独自のオブジェクト参照を持つようになります。どのように動作するか見てみましょう。

  int [] numbers = { 2, 3, 4, 5};

  int [] numbersClone = (int[])numbers.clone();

numbersClone」配列には同じ値が含まれていますが、この場合、配列オブジェクト自体は「numbers」配列とは異なる参照を指しています。

そこで、もし私が次のようなことをしたら

  numbersClone[2] = 0;

次の文の出力はどうなりますか?

  System.out.println(numbers[2]);

  System.out.println(numbersClone[2]);

ご想像のとおりです。

4

0

ソース