C#参考类型赋值与值类型赋值

C#参考类型赋值与值类型赋值,c#,C#,我理解将一个引用类型变量分配给另一个引用类型变量的理论概念,即只复制引用,而不复制对象。将一个值类型变量指定给另一个值类型变量时,将复制对象。但我无法发现代码中的不同之处。有人能指出以下两个代码块之间的区别吗?谢谢大家! 引用类型分配 using System; class Employee { private string m_name; public string Name { get { return m_name; } set

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

引用类型分配

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();
    }
}
值类型赋值

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值,而不仅仅是对内存中某个公共对象的引用


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

第一个代码片段包含Employee,它是一个类,而在第二个代码片段中,Employee是一个结构

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

将一个结构分配给另一个结构时,将生成一个副本。

当一个类被分配给另一个类时,只有引用发生了变化。

要更清楚地看到差异,请尝试以下操作

joe.Inches = 71;
bob.Inches = 59;
...
//将joe参考值分配给bob变量

bob = joe;
joe.Inches = 62;

// write bob and joe
并在引用类型示例中执行类似操作


您可以演示在第二个示例中有两个不同的高度实例,而在第一个示例中只有一个(共享)Employee实例。

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

原始员工价值观:

……还有

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

//引用类型

        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

输出是应该的。那么,问题是什么?根据示例,这只是第三点不同之处。更改其中一个引用将影响引用它的其他实例。在值类型中不会出现这种情况。如果在两个代码块中使用相同的术语,这会更清楚。就这样?哪个是哪个!?!至少说那么多或者提供一个链接。