【问题标题】:C# Reference type assignment VS value type assignmentC#引用类型赋值VS值类型赋值
【发布时间】:2009-08-02 19:46:42
【问题描述】:

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

参考类型分配

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

【问题讨论】:

  • 输出应该是这样的。那么,问题是什么?
  • 根据示例,它只是第三点不同。更改其中一个引用将影响引用它的其他实例。在值类型中不会这样。
  • 如果您在两个代码块中使用相同的术语会更清楚。

标签: c#


【解决方案1】:

嗯,明显的区别在于,在类示例中,joe 和 bob 似乎都在最后一部分更改为相同的值。

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

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

【讨论】:

  • 就这样?哪个是哪个!?!至少说这么多或提供一个链接... ._.
【解决方案2】:

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

当一个结构被分配给另一个结构时,会生成一个副本。
当一个类被分配给另一个类时,只有引用发生了变化。

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案4】:

      第一个代码 sn-p 包含 Employee ,它是一个 class,而在第二个代码中,Employee 是一个 struct

      【讨论】:

        【解决方案5】:

        要更清楚地看到差异,请尝试类似

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

        // 将 joe reference 值赋给 bob 变量

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

        并在引用类型示例中做类似的事情。

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

        【讨论】:

          【解决方案6】:

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

          最初的员工价值观:

          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。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-05-02
            • 2019-05-05
            • 1970-01-01
            • 1970-01-01
            • 2013-10-07
            • 2021-10-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多