在实施==
运算符时,我觉得我缺少一些基本要点
因此,我正在寻找一些最佳实践。
以下是我正在考虑的一些相关问题:
IEquatable<T>
的接口实现?或覆盖object.Equals
?!=
运营商呢?(此列表可能并非详尽无遗)。
答案 0 :(得分:10)
我会关注微软的Guidelines for Overloading Equals() and Operator ==。
编辑:微软的指南包含了这一重要评论,这似乎证实了Henk的答案:
默认情况下,运算符==测试引用相等性 确定两个引用是否表示相同的对象,因此引用 类型不需要实现operator ==以获得此功能 功能。当一个类型是不可变的时,意味着包含在中的数据 实例无法更改,重载operator ==进行比较 值相等而不是引用相等可能是有用的,因为,as 不可变对象,只要它们可以被认为是相同的 具有相同的价值。在非不可变类型中覆盖operator == 不推荐
答案 1 :(得分:4)
每次实施==
运算符时,请务必同时实施!=
,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);
}
答案 2 :(得分:3)
答案 3 :(得分:3)
最常见的方法是不来处理它。默认值是引用比较,通常适用于类对象。
首先,您要确保您需要价值型行为。