首页 文章

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

提问于
浏览
2

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

参考类型分配

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

6 回答

  • 1

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

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

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

  • 4

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

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

  • 3

    //参考类型

    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
    
  • 1

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

  • 2

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

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

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

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

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

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

  • 1

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

    原始员工 Value 观:

    乔=乔
    鲍勃=鲍勃

    参考分配后的值:
    乔=乔
    鲍勃=乔

    更改一个实例后的值:
    joe = Bobbi Jo
    bob = Bobbi Jo

    ...和...

    原始高度值:
    乔= 71
    鲍勃= 59

    值赋值后的值:
    乔= 71
    鲍勃= 71

    更改一个实例后的值:
    乔= 65
    鲍勃= 71

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

相关问题