网上冲浪 | 反毒杀毒 | 菜鸟进阶 | 网络安全 | 实用技术 | 网络安全 | 操作系统 |
工具软件 | 电脑医院 | 网上赚钱 | 网页制作 | 网络营销 | 经典教程 | IT趣 谈 |
当前位置:IT快活林快活林学院网页制作

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,所以当两边绝大部分的都是引用时,==比较的是引用地址.

[]作者:本站整理  来源:不祥