Please consider this code
some v1=new some();
v1.x=10;
some v2=v1;
v1.x=15;
Console.Write(v2.x);//Show 15
When I change x property on v1 why change value of x on v2?
Please consider this code
some v1=new some();
v1.x=10;
some v2=v1;
v1.x=15;
Console.Write(v2.x);//Show 15
When I change x property on v1 why change value of x on v2?
因为只有一个对象实例。
变量v1
和v2
是对同一对象的引用。当您分配v1
给v2
您时,您不会获得对象的新实例,您只需复制引用。
因为v1
是对类型对象的引用some
。当您声明some v2 = v1;
您创建此引用的副本时,而不是实际对象的副本。要创建一个新对象,您需要通过运行构造函数再次实例化该类some v2 = new some();
。
确切的行为取决于变量类型,更准确地说取决于该类型是值类型还是引用类型。
这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
,因为变量包含对象本身。
在 Visual Studio 中更改值类型的显示颜色是个好主意:
菜单:工具 > 选项
您也可以更改委托、接口和枚举的显示颜色。像这样你会立即看到它们不是 VS 编辑器中的(普通)类。
因为 v2 有对 v1 对象的引用,所以为什么
v1 和 v2 都指向同一个对象,即同一个对象引用。
some v2=v1;
它没有复制它只是复制参考
要创建对象的副本,请参考以下答案:Creating a copy of an object in C#