在实现==
运算符时,我感觉我遗漏了一些要点。
因此,我正在寻找一些最佳实践。
以下是我正在考虑的一些相关问题:
- 如何干净地处理参考比较?
- 它应该通过类似
IEquatable<T>
的接口来实现吗?还是压倒一切object.Equals
? - 那么
!=
运营商呢?
(此列表可能并不详尽)。
在实现==
运算符时,我感觉我遗漏了一些要点。
因此,我正在寻找一些最佳实践。
以下是我正在考虑的一些相关问题:
IEquatable<T>
的接口来实现吗?还是压倒一切 object.Equals
?!=
运营商呢?(此列表可能并不详尽)。
我会遵循 Microsoft 的重载 Equals() 和 Operator == 指南。
编辑:微软的指导方针包含这个重要的评论,这似乎证实了亨克的回答:
默认情况下,操作符 == 通过确定两个引用是否指示同一个对象来测试引用是否相等,因此引用类型不需要实现操作符 == 来获得此功能。当一个类型是不可变的,这意味着实例中包含的数据不能改变,重载运算符 == 来比较值相等而不是引用相等可能很有用,因为作为不可变对象,它们可以被认为是相同的,只要它们具有相同的值。不建议在非不可变类型中覆盖 operator ==
每次实现==
运算符时,请务必同时实现!=
,IEquatable<T>
并覆盖Object.Equals()
并Object.GetHashCode()
确保类用户的一致性。
考虑一个类,这是我通常的实现:
public bool Equals(MyClass other) {
if (ReferenceEquals(other, null))
return false;
if (ReferenceEquals(other, this))
return true;
return // your equality code here
}
public override bool Equals(object obj) {
return Equals(obj as MyClass);
}
public override int GetHashCode() {
return // your hash function here
}
public static bool operator ==(MyClass left, MyClass right) {
return Equals(left, right);
}
public static bool operator !=(MyClass left, MyClass right) {
return !(left == right);
}
最常见的方法是不处理它。默认值是引用比较,这通常适用于类对象。
所以首先你要非常确定你需要价值类型的行为。