我在比较字符串时,都是使用 == 和 != 运算符,但今天发现c#关于字符串比较功能很多。
除了以上的,还有Compare,Equals。
有什么区别?
首先说== 和 !=,它比较的是字符串的值。
本质上是对Equals方法一部分的重载,微软封装好的,在内部他已经对 = = 操作符进行了重写。
string a="abc";
string b="abcd"
为什么说是对Equals方法一部分的重写?
因为Equals也是挺复杂的,它的完整型:
string.Equals(string a,string b, System.StringComparison)
返回值是真(相等)或者假(不等)。
System.StringComparison 是一个枚举类型,指定比较的敏感区域性,要不要区分大小写,要不要使用序号排序规则。
CurrentCulture----- 使用区域敏感排序规则和当前区域比较字符串。
CurrentCultureIgnoreCase -----使用区域敏感排序规则、当前区域来比较字符串,同时忽略被比较字符串的大小写。
InvariantCulture -----使用区域敏感排序规则和固定区域比较字符串。
InvariantCultureIgnoreCase -----使用区域敏感排序规则、固定区域来比较字符串,同时忽略被比较字符串的大小写。
Ordinal----- 使用序号排序规则比较字符串,区分大小写。
OrdinalIgnoreCase -----使用序号排序规则并忽略被比较字符串的大小写,对字符串进行比较。
什么又是区域敏感性?
解释:计算机不同的区域设置,会影响字符串比较的结果,对于我们的中国区域设置:
null<零长度字符串<0<1<2<…<9 换成其他的区域,string.Equals的结果就可能会发生变化。
什么又是序号规则?
解释:需要对两个字符串的值进行比较和排序而不需要考虑语言惯例时。
所以很明显了,==和!= 事实上重载的是Ordinal,区分大小写。
string.Equals(string a,string b,Ordinal )
string.compare和string.Equals的区别又在哪里?
string.compare的完整型与string.Equals极其类似:
string.Compare(string a,string b,System.StringComparison )
返回值<0,等于0,大于0.
字符串 “200” 是小于 “30” 的,因为 “2” 小于 “3”.
可以说,string.Equals属于string.Compare等于0的一部分,重载的是:
if(string.Compare(string a,string b, Ordinal)==0)
string.Compare 最完善复杂,不光可以比较是否相等,还能排序。
string.Equals 是string.Compare的子集, 序号规则,相等条件时的简写。
==和!=是string.Equals的子集, 序号规则, 区分大小写时的简写。
在比较字符串时,您使用的方法应该显式指定了要执行的比较类型。
尤其是代码需要考虑国际化的时候。
这可增强代码的可维护性和可读性,避免让程序员产生歧义,到底是想比较序号?还是想比较固定区域?
应尽可能使用具有 StringComparison 枚举参数的 System.String 和 System.Array 类的方法重载,以便可以指定要执行的比较类型。
比较字符串时,最好避免使用 == 和 != 运算符。