我理解将一个引用类型变量分配给另一个引用类型变量的理论概念,只复制引用,而不是对象。将一个值类型变量分配给另一个,将复制该对象。但我无法发现代码中的不同之处。有人会指出以下两个代码块之间的区别吗?谢谢!
参考类型分配
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();
}
}
答案 0 :(得分:4)
嗯,明显的不同之处在于,对于类示例,在最后一部分中,joe和bob都显示为相同的值。
在struct示例中,它们保留了它们各自的值,因为每个变量本身就是一个完整的struct值,而不仅仅是对某个内存中的公共对象的引用。
主要的代码差异是您使用的类型, class 或 struct ,这决定了您是创建引用类型还是值类型。
答案 1 :(得分:3)
一个是结构,另一个是类。这似乎是一个过于复杂的例子,不仅涉及价值和参考差异,还涉及类和结构之间的差异。
当一个结构被分配给另一个结构时,会产生一个副本 当一个类被分配给另一个类时,只有参考更改。
答案 2 :(得分:2)
//参考类型
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
答案 3 :(得分:1)
第一个代码段包含Employee,它是类,在第二个代码片段中,Employee是 struct
答案 4 :(得分:1)
要更清楚地看到差异,请尝试
之类的内容joe.Inches = 71;
bob.Inches = 59;
...
//将joe reference 值赋给bob变量
bob = joe;
joe.Inches = 62;
// write bob and joe
在参考类型示例中做类似的事情。
您将能够证明在第二个示例中有两个不同的Height实例,而在第一个示例中,只有一个(共享)Employee实例。
答案 5 :(得分:1)
在我的系统上,这两个代码块产生以下输出:
原始员工价值观:
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
差异似乎是不言而喻的。在第一个示例中,更改其中一个值会影响两个引用,因为它们都引用相同的基础对象。在第二个示例中,更改其中一个对象仅影响该对象,因为复制值类型时,每个对象都会收到它自己的私有副本。当你说 鲍勃=乔; 在第二个样本中,您;不要分配引用(注释具有误导性)。你正在做的是创建一个新的Height结构实例,从joe复制所有值并将新对象存储为bob。