質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

2158閲覧

C#にて、クローンを行う理由にはどのようなものがあるのか?

Necro

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2020/08/25 03:47

前提・実現したいこと

まず初めに、プログラム作成初心者です。
拙いもしくは、よくわからない質問かもしれません。

あるC#のソースコード内で、クローンを作成し、クローンとの比較処理(等価性の保証?)をしているコードがあるのですが、どうしてそのようなことが思いつくのかわからないため、質問させていただきたいです。

クローンを作成する理由というのは、どのようなものがありますでしょうか?
※また参考サイト、資料などありましたら教えていただきたく思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/08/25 03:48

そのコードの意味を知りたいなら、様々な理由を聞くような迂遠なことをしなくていいんじゃないでしょうか。
退会済みユーザー

退会済みユーザー

2020/08/25 03:49

> あるC#のソースコード内で、クローンを作成し、クローンとの比較処理(等価性の保証?)をしているコードがあるのですが 具体例(その「あるC#のソースコード」)を提示してください。
YAmaGNZ

2020/08/25 04:05

そのコードにどのような意図があるか作成者に聞けばいいのではないですか? 第三者にはコードもなしに何をしているかなんて分かりようがありません。
Necro

2020/08/25 05:23

なるほど・・・ 皆様 ありがとうございます 質問の仕方すらわかっていないので、勉強になります コードの意味というよりは、クローンの使い方に近いもしれません どんな場合に「クローンを作成して何か処理したら良い」という考えが生まれるのかを知れればと思い質問させていただきました
Zuishin

2020/08/25 05:42

元のオブジェクトのプロパティを変えたくないが変わる可能性がある時にバックアップ目的で使うことが多いのではないかと思います。 ただ、最近はイミュータブルなオブジェクトで参照透過性のある関数を使うのが流行です。 回答のコメントにも出てきていますが、シャローかディープかも曖昧で、とても使いやすいインターフェースとは言えません。ジェネリックが無いところからも、古くてメンテナンスされていない軽視されたインターフェースということがわかると思います。
Zuishin

2020/08/25 06:12

まとめると、今からクローンを使う機会というのはほぼありません。
guest

回答3

0

ベストアンサー

cloneを作るとインスタンスが中身の要素を含めて複製されます。
個別に独立した複製ですから、オリジナルを書き換えてもそちらには影響はありませんし、
複製を書き換えてもオリジナルには影響はありません。
(ただし、その要素が他インスタンスへの参照の場合、参照自体がコピーされてしまうため、
そのままその先を書き換えた場合、その内容を書き換えてしまう場合があるので注意が必要です。)

紙の書類に書き込みを入れる前にコピーをしてオリジナルを保存しておく、みたいなものです。
もしくは、データを書き換える前に別名で保存しておく、とかでも良いです。

どんなときにやるか?は、オリジナルと複製を個別に扱いたい時にやります。

例にある、書き換える前と後を比較するなんてのは、まさに、オリジナルと複製とが個別に存在していなければ、成り立たない話です。
同じインスタンス同士をいくら比較したってそりゃ同じにしかなりませんから。

投稿2020/08/25 04:46

編集2020/08/25 05:16
amiya

総合スコア1218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/08/25 05:00

>cloneを作るとインスタンスが中身の要素を含めて複製されます。 個別に独立した複製ですから、オリジナルを書き換えてもそちらには影響はありませんし、 Cloneはシャローコピーなのでは?
Zuishin

2020/08/25 05:07

MemberwiseClone はシャローコピーですね。それでまずいときのために ICloneable.Clone があるのではないかと。実装次第ですが。
YAmaGNZ

2020/08/25 05:14

注釈があるのであればいいのですが、ただ「Cloneは複製されて片方を書き換えてももう一方は影響しない」とかかれるのはまずいのではないかと思った次第です。
amiya

2020/08/25 05:15

ありがとうございます。補足を付けました。
Necro

2020/08/25 05:32

自分のわかりにくい質問から回答をしていただき、 その上わかりやすくありがとうございます
guest

0

クローンを作成する理由

の具体例が,まさに

あるC#のソースコード

にあるのでしょうから,読めばいいんじゃね? とか思うのですが…
何か理由の例が欲しいなら,↓とかでどうですか?

C#

1class A 2{ 3 //この型は様々なフィールド値を持っているとして… 4 5 //こんなメソッドがある. 6 //このメソッドは,引数に渡されたaの状態に基づき何らかの処理を行うが, 7 //その過程でaの内容(フォールド値)をぐちゃぐちゃに変更してしまう! 8 public static void DoSomething( A a ) 9 { 10 ... 11 } 12} 13 14{//(どこか) 15 var MyA = new A(); 16 17 // 18 //このへんで 19 //MyAの内容をせっせと作り上げてきたとして… 20 // 21 22 //満を持してMyAの現状態に基づく処理を行いたい. 23 //しかし MyAをDoSomething()に渡してしまえば,今まで苦労して作り上げてきた MyA の内容は失われてしまうのであった! 24 A.DoSomething( MyA ); //←やりたくない. ここでもしもMyAのクローンを作れるならば,それを身代りに差し出せば全てがうまくいく. 25}

投稿2020/08/25 04:45

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Necro

2020/08/25 05:33

コメントでの解説、大変参考になりました 質問・回答の際に、コードがあるととても分かりやすいと理解しました ありがとうございます
guest

0

そりゃクローンする必要があるときですな

インスタンスを代入するだけではナカミまでコピーされないってのはわかってますかね

投稿2020/08/25 04:08

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Necro

2020/08/25 05:33

確かに… と納得してしまいました 笑 クローンについても理解が足りていなかったようでしたので、 皆様の回答から完全ではないですが、理解しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問