C#中引用类型的==运算符不会调用ReferenceEquals方法
C#中引用类型的==运算符不怎么会调用ReferenceEquals方法?class MyClass
{
public static new bool ReferenceEquals(object a,object b)
{
MessageBox.Show("ref");
return true;
}
}
==运算符对于引用类型而不能是言,比较的是引用,他不怎么会调用ReferenceEquals方法,那怎么比较?--
C# codeMyClass c1 =new MyClass();MyClass c2 =new MyClass();Console.WriteLine(c1 ==c2);
这样的一段代码从反汇编的结果来看,==并非调用ReferenceEquals函数,而不能是是使用了CEQ运算,如果要改变这一个逻辑可以通过重写“==”运算符.
IL_000c: newobj instance void ConsoleApplicationI.MyClass::.ctor()
IL_0011: stloc.0
IL_0012: newobj instance void ConsoleApplicationI.MyClass::.ctor()
IL_0017: stloc.1
IL_0018: ldloc.0
IL_0019: ldloc.1
IL_001a: ceq
IL_001c: call void [mscorlib]System.Console::WriteLine(bool)
---
==使用的是MSIL系统指令ceq,Ceq 比较两个值.如果这两个值相等,则将整数值 1 ((int32) 推送到计算堆栈上;不然的话,将 0 (int32) 推送到计算堆栈上.
但这根本没有办法说明,==并非调用ReferenceEquals函数.实际上电脑中的任何语言(Language)绝大部分的都是没有==的,只不过C#对类型进行了运算符重载,比如说是string,虽然是引用类型,但==却被重载为Equal,所以当两边绝大部分的都是引用时,==比较的是引用地址.
[]作者:本站整理 来源:不祥