赋值引用类型有什么问题?
本文关键字:问题 什么 引用类型 赋值 | 更新日期: 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";
C1
和C2
都是对同一Customer
实例的引用。
C2.Name = "Sandra";
通过引用C2
更改该客户的名称
您可以将Customer
更改为值类型,使其成为struct
而不是class
,或者使用语法Customer C2 = new Customer();
创建新的Customer
对象。
你观察到的现象被称为混叠。已创建引用C1
和C2
。然而,它们并不是指向不同的对象,而是指向一个对象,即由构造函数调用new Customer()
创建的对象。显然,您期望语句
Customer C2 = C1;
创建一个新的客户对象,然后为其分配与C1
相同的值。这不是情况-您创建一个新的引用命名为C2
,它引用与C1
相同的对象。