分配引用类型有什么问题

时间:2016-08-26 09:36:54

标签: c# reference

我有以下样本。

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.Name = Sandra&& C2.Name =桑德拉

3 个答案:

答案 0 :(得分:2)

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

相反的是:

        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";

答案 1 :(得分:0)

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

C2.Name = "Sandra";通过引用C2

更改该客户的名称

可以<{>} Customer更改为值类型,方法是将其设为struct而不是class,或者使用语法Customer C2 = new Customer();用于创建新的Customer对象。

答案 2 :(得分:0)

您观察到的现象称为aliasing。您已创建参考C1C2。但是,这些不是指不同的对象,而是指一个对象,即构造函数调用new Customer()创建的对象。显然你期待声明

Customer C2 = C1;

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