赋值引用类型有什么问题?

本文关键字:问题 什么 引用类型 赋值 | 更新日期: 2023-09-27 18:04:01

我有以下示例。

namespace sample
{
    public class Customer
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Customer C1 = new Customer();
            C1.ID = 100;
            C1.Name = "Mary";
            Customer C2 = C1;
            C2.Name = "Sandra";
            Console.WriteLine("C1.Name ={0} && C2.Name = {1}", C1.Name, C2.Name);
        }
    }
}

为什么当我给C2赋一个新值时,C1的值发生了变化。最后得到的结果是C1。姓名=Sandra &&C2。Name = Sandra

赋值引用类型有什么问题?

因为它们都是同一个对象的引用!

相反的是:

        Customer C1 = new Customer();
        C1.ID = 100;
        C1.Name = "Mary";
        // New instance stored on C2 reference
        // so now both are different references to also
        // different objects
        Customer C2 = new Customer(); 
        C2.Name = "Sandra";

C1C2都是对同一Customer实例的引用。

C2.Name = "Sandra";通过引用C2更改该客户的名称

可以Customer更改为值类型,使其成为struct而不是class,或者使用语法Customer C2 = new Customer();创建新的Customer对象。

你观察到的现象被称为混叠。已创建引用C1C2。然而,它们并不是指向不同的对象,而是指向一个对象,即由构造函数调用new Customer()创建的对象。显然,您期望语句

Customer C2 = C1;

创建一个新的客户对象,然后为其分配与C1相同的值。这不是情况-您创建一个新的引用命名为C2,它引用与C1相同的对象。