【发布时间】:2009-01-20 11:10:07
【问题描述】:
我想知道在 C# 中实现 正确、灵活和快速的 Equals 的最佳方法,它几乎可以用于任何类和情况。我认为性能需要一个专门的 Equals(将实际类的对象作为参数)。为了避免代码重复,一般的 Equals 应该调用专门的 Equals。 Null 检查应该只执行一次,即使在继承的类中也是如此。
我终于想出了这个设计:
class MyClass
{
public Int32 SomeValue1 = 1;
public Int32 SomeValue2 = 25;
// Ignoring GetHashCode for simplicity.
public override bool Equals(object obj)
{
return Equals (obj as MyClass);
}
public bool Equals(MyClass obj)
{
if (obj == null) {
return false;
}
if (!SomeValue1.Equals (obj.SomeValue1)) {
return false;
}
if (!SomeValue2.Equals (obj.SomeValue2)) {
return false;
}
return true;
}
}
class MyDerivedClass : MyClass
{
public Int32 YetAnotherValue = 2;
public override bool Equals(object obj)
{
return Equals (obj as MyDerivedClass);
}
public bool Equals(MyDerivedClass obj)
{
if (!base.Equals (obj)) {
return false;
}
if (!YetAnotherValue.Equals (obj.YetAnotherValue)) {
return false;
}
return true;
}
}
重要的想法:
- “as”运算符的使用。这样我们就不必检查一般 Equals 中的空值。错误的类类型会减少为 null,并将在专门的 Equals 中进行排序。
- 在某一点进行空值检查,即使是派生类也是如此。
- 逐个检查属性提供了清晰的结构。
这个概念有缺陷,还是我错过了任何条件?
【问题讨论】:
标签: c# null equals code-duplication