このコードを検討してください
some v1=new some();
v1.x=10;
some v2=v1;
v1.x=15;
Console.Write(v2.x);//Show 15
v1でxプロパティを変更すると、v2でxの値を変更するのはなぜですか?
このコードを検討してください
some v1=new some();
v1.x=10;
some v2=v1;
v1.x=15;
Console.Write(v2.x);//Show 15
v1でxプロパティを変更すると、v2でxの値を変更するのはなぜですか?
オブジェクトインスタンスが1つしかないためです。
変数v1
とv2
は同じオブジェクトへの参照です。オブジェクトの新しいインスタンスを取得しないように割り当てる場合は、参照をコピーするだけv1
です。v2
v1
タイプのオブジェクトへの参照であるためsome
。あなたが述べるとき、あなたsome v2 = v1;
は実際のオブジェクトのコピーではなく、この参照のコピーを作成します。新しいオブジェクトを作成するには、コンストラクターを実行してクラスを再度インスタンス化する必要がありますsome v2 = new some();
。
v2がv1オブジェクトを参照しているため、その理由は
v1とv2の両方が同じオブジェクト、つまり同じオブジェクト参照を指します。
some v2=v1;
コピーするだけの参照をコピーしない
オブジェクトのコピーを作成するには、次の回答を参照してください:C#でオブジェクトのコピーを作成する
正確な動作は、変数の型、より正確には型が値型であるか参照型であるかによって異なります。
これPoint
がstruct
、つまり値型です。
var p1 = new System.Drawing.Point(10, 20);
var p2 = p1; // This creates a copy of p1.
p1.X = 15;
Console.WriteLine(p1.X); // ==> 15
Console.WriteLine(p2.X); // ==> 10
ただし、この宣言は参照型を宣言します(クラスは常に参照型です)。
public class Vector
{
public Vector(double x, double y)
{
X = x;
Y = y;
}
public double X { get; set; }
public double Y { get; set; }
}
これは起こります:
var v1 = new Vector(10.0, 20.0);
var v2 = v1; // Now the reference v2 points to the same object as v1.
v1.X = 15.0;
Console.WriteLine(v1.X); // ==> 15.0
Console.WriteLine(v2.X); // ==> 15.0
参照型の変数には、によって動的に作成されるオブジェクトへの参照が含まれますnew
。一方、new
キーワードはaの値のみを定義し、変数にはオブジェクト自体が含まれているため、をstruct
作成しません。struct
VisualStudioで値型の表示色を変更することをお勧めします。
メニュー:ツール>オプション
デリゲート、インターフェイス、および列挙の表示色も変更できます。このように、VSのエディターではそれらが(通常の)クラスではないことがすぐにわかります。