当它应该在C#/ Java中返回-1时,IndexOf方法返回0

我的一个朋友带着这种我无法解释的奇怪行为来找我,任何洞察力的观点都会受到赞赏。

我运行VS 2005(C#2.0),以下代码显示了该行为

int rr = "test".IndexOf(""); Console.WriteLine(rr.ToString()); 

上面的代码,打印“0”,清楚地表明它应该返回-1

这也发生在Java中,以下Class显示行为:

 public class Test{ public static void main(String[] args){ System.out.println("Result->"+("test".indexOf(""))); } } 

我正在运行Java 1.6.0_17

这不是规则的例外,而是定义indexOfstartsWith的自然结果。

你声称"test".indexOf("")应该返回-1 。 这基本上等同于"test".startsWith("")应该返回false 。 为什么是这样? 虽然这个案例在文档中特别指出为返回true ,但这不仅仅是一个随意的决定。

你会如何决定"test".startsWith("te") ,例如? 最简单的方法是使用递归。 由于两个字符串都以字符't'开头,因此您调用"est".startsWith("e")并返回结果。 同样,您将调用"st".startsWith("")并返回结果。 但是你已经知道答案应该是true ,所以这就是每个字符串以""开头的原因。

引用C# 文档 :

如果value为Empty ,则返回值为0。

您描述的行为完全符合预期(至少在C#中)。

0是正确的。 从零位开始,你可以 (平凡地)匹配一个零长度的字符串。 同样,“” 包含 “”。

0是正确的。 Javadocs指出indexOf工作原理如下:

返回的整数是最小值k,这样:

  this.startsWith(str, k) 

任何以""开头的字符串都等于原始字符串(并且每个字符串都以""开头),因此str = ""的最小k始终为0。

可以这样想:IndexOf,当找到一个字符串时,将从位置0开始,尝试匹配字符串,如果它不适合,则移动到位置1,2等。当你用空调用它时string,它试​​图将空字符串与从0位置开始的长度为0的字符串进行匹配。万岁,没有什么等于什么。

旁注:当您使用Console.Write / WriteLine时,没有真正的理由使用ToString 。 该函数自动调用相关对象的ToString方法。 (除非重载ToString)

它应该返回0.你正在寻找第一次出现空字符串,对吧? 🙂

更有趣的PHP实际上做得更好!

 php -r "print strpos('test','');" PHP Warning: strpos(): Empty delimiter. in Command line code on line 1 

就是图个好玩儿。 它也像python中那样工作

 >>> "test".startswith("") True >>> "test".index("") 0 

Python抛出一个ValueError而不是-1,这很好。

 >>> "test".index('r') Traceback (most recent call last): File "", line 1, in  ValueError: substring not found