ノードというクラスがあります。次のように、各ノード内に各ノードの親を格納します。
public class Node
{
public Node parent;
}
したがって、親をノードに割り当てるとします。
Node n = new Node();
Node n2 = new Node();
n.parent = n2;
n2 を変更すると、n の親変数も変更されますか?
いいえ、 のparent
変数はn
変更されません。参照がコピーされると、それ自体が有効になります。ただし、がNode
指すを変更すると、の親はその変更を認識します。たとえば、 を設定すると、も同様に変更されます。n2
n
n2.parent = n3
n.parent.parent
n3
クラス型の変数、パラメーター、配列スロットなどは、「オブジェクト ID」を保持するものと考えてください。のようなステートメントn1.parent = n2;
は、「 に格納されているオブジェクト ID によって識別されるオブジェクトを検索します。n1
これは のタイプになります。そのオブジェクトのフィールドを、 に格納されているオブジェクト ID を含むようにNode
変更します」。parent
n2
最初n1
に [オブジェクト ID#1]n2
が割り当てられ、最初に [オブジェクト ID#2] が割り当てられたとします。このステートメントn1.parent = n2
はparent
、オブジェクト #1 のフィールドに [オブジェクト ID #2] を含めます。n2.someProperty = 5
に他のものを格納する前のようなステートメントを実行するとn2
、そのステートメントはオブジェクト #2 のそのプロパティを変更します。Object #1のparent
フィールドには [Object ID#2] が保持されているため、このステートメントも変更されているように見えn1.parent.someProperty
ます。一方、別のオブジェクト ID を に格納してn2
も、 には影響せずn1.parent
、[オブジェクト ID #2] を保持し続けます。
はい、参考までに、n.parent = n2;
明確にするために、N2 (つまりN2.prop = newvalue
)を変更すると、 を変更するn.Parent.prop
と、 になりますnewvalue
。
public class Node
{
public string a;
public Node parent;
}
Node n = new Node();
Node n2 = new Node();
n2.a = "1";
n.parent = n2;
// n.parent.a is "1" now
n2.a = "2";
// n.parent.a is "2" now
はい、参照によるものです。nとn2の両方で更新されます
はい、参照によって同じオブジェクトを参照しています。