提问人:aarifboy 提问时间:5/18/2018 更新时间:5/18/2018 访问量:270
如何在 c# 中实现赋值运算符或替代方法是什么?
How to implement assignment operator in c# or what is alternative approach?
问:
我正在寻找一种在 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
如何获得正确的输出?
答:
0赞
Ivan Koshelev
5/18/2018
#1
如果我们仅根据您提供的示例,则需要 Person 是一个“结构”。它们是通过复制值而不是引用来分配的。
评论
2赞
Damien_The_Unbeliever
5/18/2018
但是,您不希望仅根据分配做出这种决定。最根本的问题实际上是关于s是否是类值的。如果你有两个具有相同字段的 s,那么它们真的是同一个“东西”吗?Person
Person
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 的行为不是国家/地区?!?
如果使用的是类,则可以选择复制构造函数。 使用赋值运算符的一种方法是使用非引用类型,如基元或结构。但是,结构不应该有函数!这就是课程的用途。
下一个:方法中的赋值调用不良做法?
评论
Person