请考虑此代码
some v1=new some();
v1.x=10;
some v2=v1;
v1.x=15;
Console.Write(v2.x);//Show 15
当我在v1上更改x属性时,为什么要在v2上更改x的值?
答案 0 :(得分:5)
因为只有一个对象实例。
变量v1
和v2
是对同一对象的引用。当您将v1
分配给v2
时,您没有获得该对象的新实例,只需复制该引用即可。
答案 1 :(得分:1)
因为v1
是对some
类型的对象的引用。当您声明some v2 = v1;
时,您将创建此引用的副本,而不是实际对象的副本。要创建一个新对象,您需要通过运行构造函数some v2 = new some();
再次实例化该类。
答案 2 :(得分:0)
因为v2引用v1对象的原因是
v1和v2都指向相同的对象,即相同的对象引用。
some v2=v1;
它没有复制它只是复制参考
要创建对象副本,请参阅以下答案:Creating a copy of an object in C#
答案 3 :(得分:0)
确切的行为取决于变量类型,更准确地说取决于类型是值类型还是引用类型。
此处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
关键字仅定义struct
的值,但不创建struct
,因为变量包含对象本身。
最好在Visual Studio中更改值类型的显示颜色:
菜单:工具>选项
您也可以更改代理,界面和枚举的显示颜色。像这样,你会立即看到它们不是VS的编辑器中的(普通)类。