C#引用类型赋值VS值类型赋值

我理解将一个引用类型变量分配给另一个引用类型变量的理论概念,只复制引用,而不是对象。 将一个值类型变量分配给另一个,将复制该对象。 但我无法发现代码中的不同之处。 有人会指出以下两个代码块之间的区别吗? 谢谢!

参考类型分配

using System; class Employee { private string m_name; public string Name { get { return m_name; } set { m_name = value; } } } class Program { static void Main() { Employee joe = new Employee(); joe.Name = "Joe"; Employee bob = new Employee(); bob.Name = "Bob"; Console.WriteLine("Original Employee Values:"); Console.WriteLine("joe = " + joe.Name); Console.WriteLine("bob = " + bob.Name); // assign joe reference to bob variable bob = joe; Console.WriteLine(); Console.WriteLine("Values After Reference Assignment:"); Console.WriteLine("joe = " + joe.Name); Console.WriteLine("bob = " + bob.Name); joe.Name = "Bobbi Jo"; Console.WriteLine(); Console.WriteLine("Values After Changing One Instance:"); Console.WriteLine("joe = " + joe.Name); Console.WriteLine("bob = " + bob.Name); Console.ReadKey(); } } 

价值类型分配

 using System; struct Height { private int m_inches; public int Inches { get { return m_inches; } set { m_inches = value; } } } class Program { static void Main() { Height joe = new Height(); joe.Inches = 71; Height bob = new Height(); bob.Inches = 59; Console.WriteLine("Original Height Values:"); Console.WriteLine("joe = " + joe.Inches); Console.WriteLine("bob = " + bob.Inches); // assign joe reference to bob variable bob = joe; Console.WriteLine(); Console.WriteLine("Values After Value Assignment:"); Console.WriteLine("joe = " + joe.Inches); Console.WriteLine("bob = " + bob.Inches); joe.Inches = 65; Console.WriteLine(); Console.WriteLine("Values After Changing One Instance:"); Console.WriteLine("joe = " + joe.Inches); Console.WriteLine("bob = " + bob.Inches); Console.ReadKey(); } } 

嗯,明显的不同之处在于,对于类示例,在最后一部分中,joe和bob都显示为相同的值。

在struct示例中,它们保持单独的值,因为每个变量本身就是一个整个struct值,而不仅仅是对某个内存中的公共对象的引用。

代码的主要区别在于您使用的类型, 结构 ,这决定了您是创建引用类型还是值类型。

一个是结构,另一个是类。 这似乎是一个过于复杂的例子,不仅涉及价值和参考差异,还涉及类和结构之间的差异。

将一个结构分配给另一个结构时,会生成一个副本。
当一个类被分配给另一个类时,只有参考更改。

//参考类型

  StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); sb2 = sb1; sb1.Append("hello"); sb1.Append("world"); Console.WriteLine(sb2); // Output Hello World // value Type int x=100; int y = x; x = 30; Console.WriteLine(y); // Out put 100 instead of 30 

第一个代码片段包含Employee,它是一个 ,在第二个代码片段中,Employee是一个struct

为了更清楚地看到差异,尝试类似的东西

 joe.Inches = 71; bob.Inches = 59; ... 

//将joe 引用值赋给bob变量

 bob = joe; joe.Inches = 62; // write bob and joe 

并在引用类型示例中执行类似操作。

您将能够certificate在第二个示例中有两个不同的Height实例,而在第一个示例中,只有一个(共享)Employee实例。

在我的系统上,这两个代码块产生以下输出:

原始员工价值观:

 joe = Joe bob = Bob Values After Reference Assignment: joe = Joe bob = Joe Values After Changing One Instance: joe = Bobbi Jo bob = Bobbi Jo 

…和…

 Original Height Values: joe = 71 bob = 59 Values After Value Assignment: joe = 71 bob = 71 Values After Changing One Instance: joe = 65 bob = 71 

差异似乎是不言而喻的。 在第一个示例中,更改其中一个值会影响两个引用,因为它们都引用相同的基础对象。 在第二个示例中,更改其中一个对象仅影响该对象,因为复制值类型时,每个对象都会收到它自己的私有副本。 当你说bob = joe; 在第二个样本中,您;不要分配引用(注释具有误导性)。 你正在做的是创建一个新的Height结构实例,从joe复制所有值并将新对象存储为bob。