クラスのインスタンスを値渡しする方法
Discussion
Closed
解決したいこと
プロパティとかを初期化せずに標準ライブラリのクラスのインスタンスをコピーする方法がわかりません。
自分で試したこと
NugetパッケージのNewtonsoft.JSON
を使って、コピーを行いましたが、結局参照渡しになっていました。
Discussion
Closed
プロパティとかを初期化せずに標準ライブラリのクラスのインスタンスをコピーする方法がわかりません。
NugetパッケージのNewtonsoft.JSON
を使って、コピーを行いましたが、結局参照渡しになっていました。
こちらの記事を参考にディープコピーを実装すると良いかと思います
「意見交換」ではなくて質問ですよね。
具体例をサンプルコードと共に質問欄に追記できませんか? 〇〇となることを期待して、□□というコードを書いたが、期待に反して△△となってしまうというような説明と共に。
本筋から離れますが、、、
クラスのインスタンスを値渡しする方法
変数には「値型」と「参照型(オブジェクト型)」があります。
関数呼び出し時の引数に変数を渡す方法として「値渡し」と「参照渡し」があります。
それらは別々の概念で、以下の4つの組み合わせがあります。
参照型(オブジェクト型)変数は「インスタンス(オブジェクト)への参照」を値として保持します。
変数の値である「オブジェクトへの参照」(参照値)を渡すのはあくまでも「値渡し」で、「参照の値渡し」とも言われます。
値渡しすると仮引数は実引数とは別の 独立変数 になります。参照型変数の場合、別々の変数から 同じオブジェクトを共有 します。
オブジェクトの内容を変更すると呼び出し元のオブジェクトが変更されます。
仮引数に別のオブジェクトを再代入しても実引数には代入されず、呼び出し元に影響しません。
refキーワードを使うと「変数への参照」を渡す「参照渡し」になります。
参照渡しすると、実引数と仮引数が 同一変数(エイリアス) になり、変数を共有 します。
仮引数に別のオブジェクトを再代入すると実引数に代入され、呼び出し元に影響します。値型変数でも実引数に代入されます。
同じJSON文字列から二回デシリアライズを行えば、同じ内容の別インスタンスを作ることができます。
内容を複製した新たなインスタンスを作る方法として「シリアライズしてデシリアライズ」はコード量が少ない割には汎用性が高いです。
ただし遅い。(複製したいだけなのにわざわざ別形式に変換するのだからあたりまえ)