【问题标题】:How to implement assignment operator in c# or what is alternative approach?如何在 c# 中实现赋值运算符或替代方法是什么?
【发布时间】:2018-10-28 16:07:52
【问题描述】:

我正在寻找一种跳过 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# 中编写 C++,但您真的不应该这样做。我们不做复制构造函数,你不能覆盖赋值。
  • 本质上 person 和 person2 指向同一个地方,如果要克隆对象,那就是另一回事了
  • Java 和 C# 与 C++ 的不同之处在于它们不会在赋值时进行深度克隆(即调用复制构造函数)。他们只是分配浅层引用。
  • 您确定这是一个真正的问题吗? Person 是具有强身份的域实体,应尽量避免克隆。

标签: c# assignment-operator


【解决方案1】:

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

【讨论】:

  • 但是,您不会希望仅根据分配做出这种决定。基本问题实际上是关于Persons 是否具有价值。如果您有两个具有相同字段的Persons,那么它们真的是同一个“东西”吗?
  • 当然。但由于问题仅涉及技术细节,所以我的回答也是如此。
  • 不,这个问题是由一个明显习惯于编写 C++ 的人编写的,他不想学习编写 C# 的细微差别。他们犯了根本性的错误,如果他们接受了你的建议,他们只会让他们的错误延续下去。没有“技术细节”,只有有缺陷的思维。
  • 是的,这部分反映在“如果我们只按照您提供的示例”,这意味着“您的问题可能有更大的前景,但这取决于您来判断'。
【解决方案2】:

您不能在 C# 中覆盖运算符“=” See here in 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 的行为不同于 Country?!?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2017-02-17
    • 2021-04-16
    • 2016-09-27
    • 2015-08-23
    • 2013-01-19
    相关资源
    最近更新 更多