在实现一个==
运算符时,我有一种遗漏了一些基本要点的感觉。
因此,我正在寻找一些最佳实践。
以下是我正在考虑的一些相关问题:
- 如何清晰地处理引用比较?
- 应该通过类似于
IEquatable<T>
的接口来实现吗?还是重写object.Equals
? - 那么
!=
运算符呢?
(这个列表可能不是详尽无遗的)。
在实现一个==
运算符时,我有一种遗漏了一些基本要点的感觉。
因此,我正在寻找一些最佳实践。
以下是我正在考虑的一些相关问题:
IEquatable<T>
的接口来实现吗?还是重写object.Equals
?!=
运算符呢?(这个列表可能不是详尽无遗的)。
==
运算符的最佳实践是什么?"接着说:"我会遵循微软的指南<链接已失效>",引用一行曾经无疑是整个页面的内容(“避免在可变类型中执行此操作”)并不是一个特别好的答案。它不完整;对于想要了解实现==
运算符的完整最佳实践集的人来说,这并不有帮助。 - rianjs==
运算符时,一定要同时实现!=
、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);
}