9

誰かが次の違いを説明できますか:

(1.)

newObj := TMyObject.Create;
newObj.Assign(oldObj);

(2.)

newObj := oldObj;

in 2.とは同じ単一のオブジェクトnewObjを参照していますか?oldObj

これが以前にカバーされていた場合は申し訳ありませんが、検索するのは難しいです:=

4

1 に答える 1

8
newObj := TMyObject.Create; 
newObj.Assign(oldObj);

Assignが正しく実装されていると仮定すると、これは

  • TMyObject(経由でCreate)の新しいインスタンスを作成します
  • そのインスタンスへの参照を変数に格納します(演算子newObjを介して):=
  • のディープ コピーを実行し、( 経由で)の機能的に正確なコピーをoldObj作成します。newObjoldObjAssign

ここでの最終結果はTMyObject、この時点で互いの正確なコピーである 2 つの完全に別個のインスタンスを持つことです。


newObj := oldObj;

上記oldObjは、変数 への参照をコピーして格納するだけですnewObj。この場合、まだ 1 つのインスタンスしかなくTMyObject、両方の変数newObjoldObj同じインスタンスを指しています。いずれかの変数を使用してそのオブジェクトの状態を変更すると、両方とも同じ基になるオブジェクトを指しているため、両方にそれらの変更が反映されます。

これは、両方のオブジェクトが個別に変更されるため、状態が分岐する可能性がある 2 つの別個のオブジェクトがある上記の例とは対照的です。


概念的には、オブジェクト (クラス) の変数は一般に「参照型」と呼ばれます。このタイプの変数は、本質的に単なるポインターです (これがよりよく知られている場合)。参照型の代入 ( :=) は、オブジェクト自体ではなく、オブジェクトへの参照のみをコピーします。

これに対する唯一の重要な例外はstring、参照型の多くのプロパティを持つ型ですが、多くの方法で値型としても動作するようにコンパイラによって管理されます (文字列を変更すると、元の文字列を変更するのではなく、新しい変更されたコピーが生成されます。他の場所で参照されます)。

参照:あるオブジェクトから別のオブジェクトにコピーするには、変数を直接割り当てることができますか、それともプロパティを個別に割り当てる必要がありますか?

于 2015-12-27T14:53:15.427 に答える