class MyClass
{
public static new bool ReferenceEquals(object a,object b)
{
MessageBox.Show("ref");
return true;
}
}==运算符对于引用类型而言,比较的是引用,它不会调用ReferenceEquals方法,那怎么比较啊?

解决方案 »

  1.   


                MyClass c1 = new MyClass();
                MyClass c2 = new MyClass();
                Console.WriteLine(c1 == c2);
    这样的一段代码从反汇编的结果来看,==并非调用ReferenceEquals函数,而是使用了CEQ运算,如果要改变这个逻辑可以通过重写“==”运算符。   IL_000c:  newobj     instance void ConsoleApplication1.MyClass::.ctor()
      IL_0011:  stloc.0
      IL_0012:  newobj     instance void ConsoleApplication1.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)
      

  2.   

      == 使用的是MSIL指令ceq,Ceq 比较两个值。如果这两个值相等,则将整数值 1 ((int32) 推送到计算堆栈上;否则,将 0 (int32) 推送到计算堆栈上。 
      但这无法说明,==并非调用ReferenceEquals函数。实际上计算机中的任何语言都是没有==的,只不过C#对类型进行了运算符重载,例如string,虽然是引用类型,但==却被重载为Equal,所以当两边都是引用时,==比较的是引用地址。
      

  3.   

    如果==是在调用ReferenceEquals,那么IL_001a至少应该是call吧?