我需要检查两个相同类型的对象是否是相同实例并指向相同的内存分配。问题在于该类型已经重载了等号操作符,因此它将使用它来比较它们是否相等,但我需要检查它们的引用。我查看了object.ReferenceEquals()
方法,但它在内部应用了等号操作符。
运算符不能被“覆盖” - 它们只能被“重载”。
因此,在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
ReferenceEquals
可以完全满足你的需要,除非你在讨论一个字典。它不会检查Equals
(它只是执行ldarg.0
、ldarg.1
、ceq
和ret
)。或者,你也可以将其强制转换为对象:
bool same = (object)x == (object)y;
GetHashCode
),System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj)
是您的好帮手。