以下两行代码比较字符串值是否有任何区别。
string str = "abc";
if(str.Equals("abc"))
和
if("abc".Equals(str))
在第一行中我在字符串变量上调用equals方法将其与字符串文字进行比较。第二行反之亦然。它只是编码风格的差异,或者编译器处理这两个语句的方式有所不同。
答案 0 :(得分:30)
唯一的区别是,在第一种情况下,当你这样做时:
str.Equals("abc")
如果str
为null
,您将在运行时收到异常。通过做:
"abc".Equals(str)
如果str
为null
,您将获得false
。
答案 1 :(得分:10)
不同之处在于,在第二个示例中,您永远不会得到NullReferenceException
,因为文字不能为空。
答案 2 :(得分:7)
要添加到其他答案:静态string.Equals("abc", str)
方法总是避免触发空引用异常,无论您传递两个字符串的顺序如何。
答案 3 :(得分:4)
正如mmyers所说,你的第二个例子不会抛出NullReferenceException
并且允许程序“显示”无误运行,可能会导致意外结果。
答案 4 :(得分:1)
是的,编译器处理语句的方式不同。大多数语言中String的函数equals遵循相同的guidlines。这是一个半字节:
override def Equals(that:String):Boolean //Should override Object.Equals
if(that==null) return false
for i from 0 to this.length
if(!this(i).Equals(that(i))) return false
return true
通常情况下,该方法会检查 是一个字符串,而这个和 具有相同的长度。
正如其他人所指出的,你可以看到,如果 是null
,该方法将返回 false 。另一方面,该方法是String的一部分,因此无法在null
上调用它。这就是为什么在你的exampleif str为null时,你会得到一个NullReferenceException
。
话虽如此,如果你知道两个变量都是相同长度的非空字符串,那么两个语句将在同一时间内评估为相同的。