通常(根据我的理解)我必须遵循很多步骤
覆盖"等于"以检查对象的状态.
示例:
public override bool Equals(object obj)
{
if (obj is SalesPerson && obj != null)
{
SalesPerson temp;
temp = (SalesPerson)obj;
if (temp.fName == this.fName && temp.lName == this.fName
&& temp.personAge == this.personAge )
{
return true;
}
else
{
return false;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
LINQ或其他技术的任何其他选择给我快捷代码?
更新:
此外,当我覆盖"等于"时,我也必须覆盖GetHasCode().
Jon*_*eet 11
到目前为止,所有答案对我来说似乎都很好.但是,您应该仔细考虑在继承层次结构中要求相等的含义.一个实例SalesPerson可以等于一个实例SalesManager(可以从中派生出来SalesPerson)吗?
麻烦的是,equals的对称性质阻碍了它.假设我们有:
SalesPerson x = new SalesPerson { ... };
SalesManager y = new SalesManager { ... };
Run Code Online (Sandbox Code Playgroud)
我希望y.Equals(x)是假的 - 这意味着它也x.Equals(y)应该是假的.
这意味着办理登机手续SalesPerson 确实需要:
public override bool Equals(object obj)
{
SalesPerson salesPerson = obj as SalePerson;
if (salesPerson == null) return false;
return salesPerson.GetType() == this.GetType() &&
salesPerson.fName == this.fName &&
salesPerson.lName == this.fName &&
salesPerson.personAge == this.personAge;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我没有比较,typeof(SalesPerson)因为实现SalesManager可能首先要调用此实现.
当然,如果SalesPerson密封,所有这些复杂性都会消失...在引入继承之前要非常小心的另一个原因:)
这看起来更整洁:
public override bool Equals(object obj)
{
SalesPerson salesPerson = obj as SalePerson;
if(salesPerson == null) return false;
return salesPerson.fName == this.fName &&
salesPerson.lName == this.fName &&
salesPerson.personAge == this.personAge;
}
Run Code Online (Sandbox Code Playgroud)
当然,如果您真的想将它压缩成一行,您可以使用:
public override bool Equals(object obj)
{
SalesPerson salesPerson = obj as SalePerson;
return (salesPerson != null) &&
(salesPerson.fName == this.fName &&
salesPerson.lName == this.fName &&
salesPerson.personAge == this.personAge);
}
Run Code Online (Sandbox Code Playgroud)
非null的测试保证首先运行,因此在其余的相等测试中不会发生潜在的NullReferenceException.
| 归档时间: |
|
| 查看次数: |
805 次 |
| 最近记录: |