C#中如何实现赋值运算符?替代方案及赋值拷贝问题解决
如何在C#中通过赋值操作实现正确的对象拷贝
嗨,我来帮你理清这个问题!你遇到的现象其实是C#引用类型的默认行为导致的:直接执行person2 = person并没有创建新的对象实例,只是把person2的引用指向了person所指向的同一个内存地址。所以当你修改person的属性时,person2因为和它指向同一个对象,自然也会显示修改后的结果。
下面给你几种可行的解决方案,让赋值操作实现真正的对象拷贝:
方法1:重载赋值运算符operator=
这是最贴合你需求的方式,让赋值操作自动完成属性拷贝,用法和你现在的赋值代码完全一致:
class Person { public string Name { get; set; } public int Age { get; set; } public Person() { } public Person(string name, int age) { Name = name; Age = age; } // 重载赋值运算符,实现属性拷贝 public static Person operator=(Person target, Person source) { // 处理target为null的情况 if (target == null) { return new Person(source.Name, source.Age); } // 拷贝属性 target.Name = source.Name; target.Age = source.Age; return target; } public void Get() { Console.WriteLine("{0} {1}", Name, Age); } };
现在执行你的测试代码:
Person person= new Person("Arif",40); person.Get(); Person person2 = new Person(); person2 = person;// 现在这个赋值会触发我们重载的运算符,完成属性拷贝 person2.Get(); person.Set("Mahmood",44); person.Get(); person2.Get();
就能得到你预期的输出:
Arif 40 Arif 40 Mahmood 44 Arif 40
方法2:利用现有Set方法手动拷贝
如果你不想修改类的结构重载运算符,也可以在创建person2后,调用Set方法把原对象的属性传进去:
Person person2 = new Person(); // 调用Set方法拷贝原对象的属性 person2.Set(person.Name, person.Age);
这种方式简单直接,不需要修改类的定义,只是需要多写一行代码。
方法3:手动逐个复制属性
如果没有Set方法,也可以直接给新对象的属性逐个赋值:
Person person2 = new Person(); person2.Name = person.Name; person2.Age = person.Age;
效果和方法2一致,适合属性数量不多的场景。
小提醒
C#中**引用类型(比如自定义类)**默认赋值是传递引用,而值类型(比如int、bool,以及特殊的string)赋值是传递值。如果想让引用类型的赋值实现对象拷贝,要么重载赋值运算符,要么手动复制属性。
内容的提问来源于stack exchange,提问作者aarifboy
相关产品推荐
相关产品推荐

