Ein Freund von mir kam mit diesem seltsamen Verhalten zu mir, das ich nicht erklären kann, jede Einsicht wäre willkommen.
Im Ausführen von VS 2005 (C # 2.0) zeigt der folgende Code das Verhalten
%Vor%den obigen Code, drucken Sie "0", die deutlich zeigen, dass es -1 zurückgeben sollte
Dies geschieht auch in Java, wo die folgende Klasse das Verhalten zeigt:
%Vor%Im Ausführen von Java 1.6.0_17
Dies ist keine Ausnahme von der Regel, sondern eine natürliche Folge davon, wie indexOf
und startsWith
definiert sind.
Sie behaupten, dass "test".indexOf("")
-1
zurückgeben soll. Dies entspricht im Wesentlichen der Behauptung, dass "test".startsWith("")
false
zurückgeben soll. Warum ist das? Obwohl dieser Fall in der Dokumentation speziell als Rückgabe von true
behandelt wird, ist dies nicht nur eine willkürliche Entscheidung.
Wie würden Sie zum Beispiel "test".startsWith("te")
entscheiden? Der einfachste Weg ist die Rekursion. Da beide Strings mit dem Zeichen 't'
beginnen, rufen Sie "est".startsWith("e")
auf und geben das Ergebnis zurück. Analog rufen Sie "st".startsWith("")
auf und geben das Ergebnis zurück. Aber Sie wissen bereits, dass die Antwort true
sein sollte, deshalb beginnt jede Zeichenfolge mit ""
.
Zitat aus der C # Dokumentation :
Wenn der Wert Leer ist, wird der Rückgabewert zurückgegeben ist 0.
Das von Ihnen beschriebene Verhalten ist vollständig wie erwartet (zumindest in C #).
0 ist korrekt. Beginnen Sie bei Position Null, und Sie können (trivial) mit einer Zeichenfolge der Länge Null übereinstimmen. Ebenso enthält " " ".
0 ist korrekt. Die Javadocs weisen darauf hin, dass indexOf
wie folgt funktioniert:
Die zurückgegebene Ganzzahl ist die kleinste Wert k so, dass:
%Vor%
Jede Zeichenfolge, die mit ""
beginnt, ist gleich der ursprünglichen Zeichenfolge (und jede Zeichenfolge beginnt mit ""
), sodass die kleinste k
für str = ""
immer 0 ist.
Stellen Sie sich das so vor: IndexOf beginnt bei der Suche nach einer Zeichenkette an der Position 0, versucht, die Zeichenkette zu finden, wenn sie nicht passt, gehen Sie weiter zu Position 1, 2 usw. Wenn Sie sie aufrufen Mit einer leeren Zeichenfolge versucht es, die leere Zeichenfolge mit der Zeichenfolge ab Position 0 mit der Länge 0 abzugleichen. Und hurra, nichts ist gleich Null.
Randnotiz: Es gibt keinen Grund, ToString
zu verwenden, wenn Sie Console.Write / WriteLine verwenden. Die Funktion ruft automatisch die Methode ToString
des betreffenden Objekts auf. (Es sei denn, ToString wird überladen)
Nur zum Spaß. Es funktioniert auch so in Python
%Vor%Python löst einen ValueError anstelle von -1 aus, was nett ist.
%Vor%