【发布时间】:2010-12-11 02:10:47
【问题描述】:
== 运算符在 C# 中如何真正发挥作用?如果它用来比较A类的对象,它会尝试匹配A的所有属性,还是会寻找指向相同内存位置的指针(或者可能别的)?
让我们创建一个假设的例子。我正在编写一个使用 Twitter API 的应用程序,它有一个 Tweet 类,它具有单个推文的所有属性:文本、发件人、日期和时间、来源等。如果我想比较 Tweet 类的对象是否相等,我可以使用:
Tweet a, b;
if (a == b)
{
//do something...
}
是否会检查 a 和 b 之间 Tweet 类的所有属性的等价性?
如果不是,正确的方法是重载 == 运算符以显式检查所有字段的等价性吗?
更新:根据前两个答案,我是否正确地假设:
- 如果
==运算符或Equals 方法没有为类重载,则使用object 类的==运算符。 -
object 类的
==运算符检查内存位置是否相等。 - 我必须重载
==运算符或 Equals 方法才能完成这项任务。 - 在重载中,我必须手动检查属性中的等价性,所以没有办法半自动地进行,比如在循环中,对吧?
更新 #2: Yuriy 发表评论说,可以使用 reflection 检查 == 运算符中的属性等价性。如何才能做到这一点?你能给我一些示例代码吗?谢谢!
【问题讨论】:
-
在重载运算符之前,请考虑一下:当涉及运算符重载时,我通常的经验法则是问自己这个问题:“这是否具有常识?任何其他开发人员会立即知道操作员甚至不看实现(代码)?”如果答案不是“100% 是”,请不要这样做。如果是,那绝对是,去吧。
标签: c# operators operator-overloading equals-operator type-equivalence