C#中的==、Equal、ReferenceEqual

来源:互联网 发布:python 字典取值 编辑:程序博客网 时间:2024/04/29 20:48
  虽然使用.NET编程已经不短的时间,但有些问题虽然知道个大体或看过诸多专家大牛的解释,却始终没有认真的追究过,写到代码里难免忐忑。
关于C#的相等比较运算,也是知道个大体:
1、==和Equal一般具有相同的逻辑,默认情况下,==应该就是使用Equal进行比较的。
2、Equal比较参数的值。对于引用类型,Equal与ReferenceEqual返回值一致。
3、ReferenceEqual比较参数的引用对象是否相同。对于值类型,就算值相等,但传给函数时,也需要装箱成不同的对象,因此无论如何,此函数对于值类型参数总是返回False。

有一个特殊情况是字符串类型,字符串是引用类型,然而人们习惯于把字符串看成值类型,对它的操作和使用是按照值类型的方式来做的。一般情况下,我们都期望以下代码返回True:

String Str = "String";
return Str == "Other String".Substring(6,6);

但是按照==的一般规律,此函数的返回值应该为False。
我一直觉得微软在处理这样的问题方面是做得比较好的,因此可以相信它已经重载了==和Equal。但是又经常看到有一些面试题什么的,经常拿这个来唬人。于是自己也不免心虚。遂测试了一下,结果如下:

StrA == StrB : True
Object.Equal(StrA,StrB) : True
Object.ReferenceEquals(StrA,StrB) : False
ObjA == ObjB : False
Object.Equal(ObjA,ObjB) : False
Object.ReferenceEquals(ObjA,ObjB) : False
IntA == IntB : True
Object.Equal(IntA,IntB) : True
Object.ReferenceEquals(IntA,IntB) : False

根据以上结果,可以看出,对于相等比较,String是引用类型的一个例外,它具有与值类型相同的表现。

关于String类型,MSDN中有说明:对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。(见:ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_csref/html/34c6b597-caa2-4855-a7cd-38ecdd11bd07.htm)

注:Java中的String类型表现与引用类型一致。
原创粉丝点击