You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:52:42