誰かが次の違いを説明できますか:
(1.)
newObj := TMyObject.Create;
newObj.Assign(oldObj);
と
(2.)
newObj := oldObj;
in 2.とは同じ単一のオブジェクトnewObj
を参照していますか?oldObj
これが以前にカバーされていた場合は申し訳ありませんが、検索するのは難しいです:=
誰かが次の違いを説明できますか:
(1.)
newObj := TMyObject.Create;
newObj.Assign(oldObj);
と
(2.)
newObj := oldObj;
in 2.とは同じ単一のオブジェクトnewObj
を参照していますか?oldObj
これが以前にカバーされていた場合は申し訳ありませんが、検索するのは難しいです:=
newObj := TMyObject.Create;
newObj.Assign(oldObj);
Assign
が正しく実装されていると仮定すると、これは
TMyObject
(経由でCreate
)の新しいインスタンスを作成しますnewObj
を介して):=
oldObj
作成します。newObj
oldObj
Assign
ここでの最終結果はTMyObject
、この時点で互いの正確なコピーである 2 つの完全に別個のインスタンスを持つことです。
newObj := oldObj;
上記oldObj
は、変数 への参照をコピーして格納するだけですnewObj
。この場合、まだ 1 つのインスタンスしかなくTMyObject
、両方の変数newObj
とoldObj
同じインスタンスを指しています。いずれかの変数を使用してそのオブジェクトの状態を変更すると、両方とも同じ基になるオブジェクトを指しているため、両方にそれらの変更が反映されます。
これは、両方のオブジェクトが個別に変更されるため、状態が分岐する可能性がある 2 つの別個のオブジェクトがある上記の例とは対照的です。
概念的には、オブジェクト (クラス) の変数は一般に「参照型」と呼ばれます。このタイプの変数は、本質的に単なるポインターです (これがよりよく知られている場合)。参照型の代入 ( :=
) は、オブジェクト自体ではなく、オブジェクトへの参照のみをコピーします。
これに対する唯一の重要な例外はstring
、参照型の多くのプロパティを持つ型ですが、多くの方法で値型としても動作するようにコンパイラによって管理されます (文字列を変更すると、元の文字列を変更するのではなく、新しい変更されたコピーが生成されます。他の場所で参照されます)。
参照:あるオブジェクトから別のオブジェクトにコピーするには、変数を直接割り当てることができますか、それともプロパティを個別に割り当てる必要がありますか?