C# 更改引用类型的值 请考虑此代码 some v1=new some(); v1.x=10; some v2=v1; v1.x=15; Console.Write(v2.x);//Show 15

C# 更改引用类型的值 请考虑此代码 some v1=new some(); v1.x=10; some v2=v1; v1.x=15; Console.Write(v2.x);//Show 15,c#,C#,当我更改v1上的x属性时,为什么要更改v2上x的值?因为v2引用了v1对象,这是为什么 v1和v2都指向相同的对象,即相同的对象引用 some v2=v1; 它不是复制它只是复制引用 要创建对象的副本,请参考以下答案:因为v2正在引用v1对象,这是为什么 v1和v2都指向相同的对象,即相同的对象引用 some v2=v1; 它不是复制它只是复制引用 要创建对象的副本,请参考以下答案:,因为只有一个对象实例 变量v1和v2是对同一对象的引用。将v1分配给v2时,不会得到对象的新实例,只需复制引

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

因为v2引用了v1对象,这是为什么

v1和v2都指向相同的对象,即相同的对象引用

some v2=v1;
它不是复制它只是复制引用


要创建对象的副本,请参考以下答案:

因为v2正在引用v1对象,这是为什么

v1和v2都指向相同的对象,即相同的对象引用

some v2=v1;
它不是复制它只是复制引用


要创建对象的副本,请参考以下答案:

,因为只有一个对象实例


变量v1和v2是对同一对象的引用。将v1分配给v2时,不会得到对象的新实例,只需复制引用。

因为只有一个对象实例


变量v1和v2是对同一对象的引用。将v1指定给v2时,不会得到对象的新实例,只需复制引用。

因为v1是对某种类型对象的引用。当你陈述一些v2=v1;创建此引用的副本,而不是实际对象的副本。要创建新对象,需要通过运行构造函数some v2=new some;再次实例化该类

因为v1是对某种类型对象的引用。当你陈述一些v2=v1;创建此引用的副本,而不是实际对象的副本。要创建新对象,需要通过运行构造函数some v2=new some;再次实例化该类

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

这里的点是一个结构,即一个值类型:

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关键字只定义结构的值,而不创建结构,因为变量包含对象本身

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

菜单:工具>选项


您还可以更改代理、接口和枚举的显示颜色。这样,您将立即在VS.的编辑器中看到它们不是普通类。确切的行为取决于变量类型,更确切地说取决于类型是值类型还是引用类型

这里的点是一个结构,即一个值类型:

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关键字只定义结构的值,而不创建结构,因为变量包含对象本身

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

菜单:工具>选项


您还可以更改代理、接口和枚举的显示颜色。这样,您将立即在VS.的编辑器中看到它们不是普通类,因为v2和v1是同一个实例。他们共享相同的记忆空间。为什么C仍然应该在学校教授的例子。@你是老师吗?如果你不喜欢这个问题,你可以关闭这个问题,与uv1和v2无关的是参考;这些非常类似于其他语言所称的指针。在这段老生常谈但令人惊讶的教育视频中,他们得到了很好的解释:因为v2和v1是同一个实例。他们共享相同的记忆空间。为什么C仍然应该在学校教授的例子。@你是老师吗?如果你不喜欢这个问题,你可以关闭这个问题,与uv1和v2无关的是参考;这些非常类似于其他语言所称的指针。在这段老生常谈但令人惊讶的教育视频中,他们得到了很好的解释:为了完整性,如果你真的想要一个对象的副本,你应该克隆它。有关完整性的参考信息,请参阅。如果确实需要对象的副本,则应克隆它。请参阅以供参考