【发布时间】:2009-10-06 11:12:12
【问题描述】:
在实现 == 运算符时,我感觉我遗漏了一些要点。
因此,我正在搜索一些最佳实践。
以下是我正在考虑的一些相关问题:
- 如何干净利落地处理参考比较?
- 应该通过类似
IEquatable<T>的接口来实现吗?还是覆盖object.Equals? - 那么
!=运算符呢?
(此列表可能并不详尽)。
【问题讨论】:
标签: c# operators equals-operator
在实现 == 运算符时,我感觉我遗漏了一些要点。
因此,我正在搜索一些最佳实践。
以下是我正在考虑的一些相关问题:
IEquatable<T>的接口来实现吗?还是覆盖object.Equals?!= 运算符呢?(此列表可能并不详尽)。
【问题讨论】:
标签: c# operators equals-operator
我会关注微软的Guidelines for Overloading Equals() and Operator ==。
编辑:微软的指导方针包含这个重要的评论,这似乎证实了 Henk 的回答:
默认情况下,运算符 == 通过以下方式测试引用相等性 确定两个引用是否表示同一个对象,所以引用 类型不需要实现 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);
}
【讨论】:
【讨论】:
最常见的方法是不来处理它。默认值是引用比较,这通常适用于类对象。
所以首先你要非常确定你需要值类型的行为。
【讨论】: