更改参考类型的值

时间:2013-03-26 19:51:33

标签: c#

请考虑此代码

some v1=new some();
v1.x=10;
some v2=v1;
v1.x=15;
Console.Write(v2.x);//Show 15

当我在v1上更改x属性时,为什么要在v2上更改x的值?

4 个答案:

答案 0 :(得分:5)

因为只有一个对象实例。

变量v1v2是对同一对象的引用。当您将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)

确切的行为取决于变量类型,更准确地说取决于类型是值类型还是引用类型。

此处Pointstruct,即值类型:

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中更改值类型的显示颜色:

菜单:工具>选项 enter image description here

您也可以更改代理,界面和枚举的显示颜色。像这样,你会立即看到它们不是VS的编辑器中的(普通)类。