class MyClass
{
public static new bool ReferenceEquals(object a,object b)
{
MessageBox.Show("ref");
return true;
}
}==运算符对于引用类型而言,比较的是引用,它不会调用ReferenceEquals方法,那怎么比较啊?
{
public static new bool ReferenceEquals(object a,object b)
{
MessageBox.Show("ref");
return true;
}
}==运算符对于引用类型而言,比较的是引用,它不会调用ReferenceEquals方法,那怎么比较啊?
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)
但这无法说明,==并非调用ReferenceEquals函数。实际上计算机中的任何语言都是没有==的,只不过C#对类型进行了运算符重载,例如string,虽然是引用类型,但==却被重载为Equal,所以当两边都是引用时,==比较的是引用地址。