以下两行代码比较字符串值有什么区别。
string str = "abc";
if(str.Equals("abc"))
and
if("abc".Equals(str))
第一行我在字符串变量上调用equals方法来将其与字符串字面值进行比较。第二行则相反。这只是编码风格的区别还是这两个语句被编译器处理的方式有所不同。
以下两行代码比较字符串值有什么区别。
string str = "abc";
if(str.Equals("abc"))
and
if("abc".Equals(str))
第一行我在字符串变量上调用equals方法来将其与字符串字面值进行比较。第二行则相反。这只是编码风格的区别还是这两个语句被编译器处理的方式有所不同。
唯一的区别在于,第一种情况下,当你执行以下操作时:
str.Equals("abc")
如果 str
是 null
,你将在运行时得到一个异常。通过执行以下操作:
"abc".Equals(str)
如果str
是null
,则会得到false
。区别在于第二个示例中,您永远不会收到NullReferenceException
,因为字面值不能为null。
((string)null).Equals(str)
!(开个玩笑。) - Jeffrey L Whitledge除了其他答案之外,静态的string.Equals("abc", str)
方法总是避免触发空引用异常,无论您以哪种顺序传递这两个字符串。
正如mmyers所说的那样,第二个示例不会抛出NullReferenceException
,虽然程序将“表现”为无错误运行,但可能导致意想不到的结果。
是的,编译器处理语句的方式是不同的。在大多数语言中,String类型的equals函数遵循相同的指导方针。下面是一个伪代码:
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
通常,该方法首先会检查that是否为字符串,并且this和that的长度相同。
正如其他人指出的那样,您可以看到如果that为空,则该方法会返回false。另一方面,该方法是String类的一部分,因此无法对null
调用该方法。这就是为什么在您的示例中,如果str为null,则会引发NullReferenceException
的原因。
话虽如此,如果您知道两个变量都是非空字符串且长度相同,则两个语句将同时计算并产生相同的结果。