2009-08-02 103 views
2

我理解将一个引用类型变量分配给另一个引用类型变量的理论概念,只复制引用,而不是对象。将一个值类型变量分配给另一个值,该对象被复制。但是我无法发现代码中的不同。有人会好好指出以下两个代码块之间的区别吗?谢谢!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(); 
    } 
} 

VALUE类型分配

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(); 
    } 
} 
+2

输出是理所应当的。那么,问题是什么? – shahkalpesh 2009-08-02 19:54:40

+0

按照这个例子,它只是第三点,它是不同的。更改其中一个引用会影响引用它的其他实例。值类型不是这种情况。 – shahkalpesh 2009-08-02 19:56:46

回答

4

好,明显不同的是,在类的例子,它出现Joe和在最后一部分鲍勃发生变化,因此,以相同的价值。

在结构示例中,它们保留它们各自的值,仅仅因为每个变量本身就是一个整体结构值,而不仅仅是对内存中某个公共对象的引用。

的主要代码明智的区别是使用类型,结构,这个决定是否要创建一个引用类型或值类型。

1

第一代码段包含雇员其为类,并在第二个,雇员是结构

3

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

当一个结构被分配给另一个结构副本时。
当一个类被分配给另一个只有引用的变化。

1

要看到其中的差别更清楚,你可以试试

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

//指定乔 参考 值鲍勃变量

bob = joe; 
joe.Inches = 62; 

// write bob and joe 

而且做的引用类型例如类似的东西。

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

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 

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

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