当等号运算符被重载时,通过引用比较两个对象

9

我需要检查两个相同类型的对象是否是相同实例并指向相同的内存分配。问题在于该类型已经重载了等号操作符,因此它将使用它来比较它们是否相等,但我需要检查它们的引用。我查看了object.ReferenceEquals()方法,但它在内部应用了等号操作符。


不,它不会。它使用自己的相等运算符来比较引用,而不是重载的运算符。 - Panagiotis Kanavos
2个回答

9

运算符不能被“覆盖” - 它们只能被“重载”。

因此,在object.ReferenceEquals中,==运算符仍在比较引用,或者您可以通过将一个或多个操作数转换来自己执行相同的操作:

string x = "some value";
string y = new string(x.ToCharArray());
Console.WriteLine(x == y);                   // True
Console.WriteLine((object) x == (object) y); // False
Console.WriteLine(ReferenceEquals(x, y));    // False

6

ReferenceEquals可以完全满足你的需要,除非你在讨论一个字典。它不会检查Equals(它只是执行ldarg.0ldarg.1ceqret)。或者,你也可以将其强制转换为对象:

bool same = (object)x == (object)y;

如果您需要字典支持(例如:GetHashCode),System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj) 是您的好帮手。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接