1

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?

4

4 回答 4

5

因为只有一个对象实例。

变量v1v2是对同一对象的引用。当您分配v1v2您时,您不会获得对象的新实例,您只需复制引用。

于 2013-03-26T19:53:35.400 回答
1

因为v1是对类型对象的引用some。当您声明some v2 = v1;您创建此引用的副本时,而不是实际对象的副本。要创建一个新对象,您需要通过运行构造函数再次实例化该类some v2 = new some();

于 2013-03-26T19:54:10.357 回答
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关键字仅定义 a 的值struct,但不创建struct,因为变量包含对象本身。


在 Visual Studio 中更改值类型的显示颜色是个好主意:

菜单:工具 > 选项 在此处输入图像描述

您也可以更改委托、接口和枚举的显示颜色。像这样你会立即看到它们不是 VS 编辑器中的(普通)类。

于 2013-03-26T20:07:46.173 回答
0

因为 v2 有对 v1 对象的引用,所以为什么

v1 和 v2 都指向同一个对象,即同一个对象引用。

some v2=v1;

它没有复制它只是复制参考

要创建对象的副本,请参考以下答案:Creating a copy of an object in C#

于 2013-03-26T19:52:23.637 回答