如何在 c# 中实现赋值运算符或替代方法是什么?

How to implement assignment operator in c# or what is alternative approach?

提问人:aarifboy 提问时间:5/18/2018 更新时间:5/18/2018 访问量:270

问:

我正在寻找一种在 C# 中跳过复制构造函数方法的好方法,并寻找一种方法来在下面的代码中对赋值做同样的事情:

class Person
{
    string Name;
    int Age;
    public Person() { }
    //public Person(Person p)//copy contructor
    //{
    //    this.Name = p.Name;
    //    this.Age = p.Age;
    //}
    public Person(string name ,int age)
    {
        this.Name = name;
        this.Age = age;
    }
    public void Set(string name,int age)
    {
        this.Name = name;
        this.Age = age;
    }
    public void Get()
    {
        Console.WriteLine("{0}  {1}",Name,Age);
    }
};

        Person person= new Person("Arif",40);
        person.Get();
        //Person person2 = new Person(person);//skip copy
        Person person2 = new Person();
        person2 = person;//use assignment
        person2.Get();
        person.Set("Mahmood",44);
        person.Get();
        person2.Get();

在实现复制构造函数时,我看到的输出是需要的

Arif  40
Arif  40
Mahmood  44
Arif  40

但是我看到的分配输出是错误的,下面给出了

Arif  40
Arif  40
Mahmood  44
Mahmood  44

如何获得正确的输出?

C# 赋值运算符

评论

7赞 Damien_The_Unbeliever 5/18/2018
您可以尝试用 C# 编写 C++,但您真的不应该这样做。我们不做复制构造函数,你不能覆盖赋值。
4赞 TheGeneral 5/18/2018
从本质上讲,person 和 person2 指向同一个地方,如果你想克隆对象,那就是另一回事了
4赞 StuartLC 5/18/2018
Java 和 C# 与 C++ 的不同之处在于它们不会在赋值时深度克隆(即调用复制构造函数)。他们只是分配浅层引用。
1赞 bommelding 5/18/2018
你确定这是一个真正的问题吗? 是具有强标识的域实体,应尽可能避免克隆。Person

答:

0赞 Ivan Koshelev 5/18/2018 #1

如果我们仅根据您提供的示例,则需要 Person 是一个“结构”。它们是通过复制值而不是引用来分配的。

评论

2赞 Damien_The_Unbeliever 5/18/2018
但是,您不希望仅根据分配做出这种决定。最根本的问题实际上是关于s是否是类值的。如果你有两个具有相同字段的 s,那么它们真的是同一个“东西”吗?PersonPerson
0赞 Ivan Koshelev 5/19/2018
绝对。但是,由于问题仅涉及技术细节,因此我的答案也是如此。
0赞 Damien_The_Unbeliever 5/20/2018
不,这个问题是由一个明显习惯于编写 C++ 的人编写的,他并没有试图学习编写 C# 的细微差别。他们正在犯根本性的错误,如果他们接受了你的建议,他们只会使他们的错误永久化。没有“技术细节”,只有有缺陷的思维。
0赞 Ivan Koshelev 5/20/2018
是的,这部分反映在“如果我们只按照你提供的例子”,这意味着“你的问题可能有一个更大的图景,但这取决于你来判断”。
0赞 Chrᴉz remembers Monica 5/18/2018 #2

不能在 C# 中重写运算符“=”,请参阅 MSDN 中的此处

=, ., ?:, ??, ->, =>, f(x), as, checked, unchecked, default, delegate, is, new, sizeof, typeof =======> 这些运算符不能重载

此外,否认正常行为的作业令人困惑

person1 = person2; //Your Person class
county1 = country2; // Some other class

两者都是类(Person & Country)的实例,因此被引用。为什么 Person 的行为不是国家/地区?!?

如果使用的是类,则可以选择复制构造函数。 使用赋值运算符的一种方法是使用非引用类型,如基元或结构。但是,结构不应该有函数!这就是课程的用途。