Titel ist die gesamte Frage. Kann mir jemand einen Grund nennen, warum dies passiert?
c#
java
startswith
Geschachtelt
quelle
quelle
Ich werde versuchen, näher auf das einzugehen, was Jon Skeet gesagt hat.
Angenommen, x, y und z sind Zeichenfolgen, und der Operator + ist tatsächlich eine Verkettung.
Wenn wir z teilen können, um z = x + y zu schreiben, bedeutet dies, dass z mit x beginnt. Da jede Zeichenfolge z in z = "" + z aufgeteilt werden kann, beginnt jede Zeichenfolge mit "".
Also, weil ("" + "abcd") == "abcd" folgt, dass "abcd" mit "" beginnt
quelle
Diese Methode vergleicht den Wertparameter mit der Teilzeichenfolge am Anfang dieser Zeichenfolge, die dieselbe Länge wie der Wert hat, und gibt einen Wert zurück, der angibt, ob sie gleich sind. Um gleich zu sein, muss der Wert eine leere Zeichenfolge (leer) sein, ein Verweis auf dieselbe Instanz oder mit dem Anfang dieser Instanz übereinstimmen.
.NET String.StartsWith
true, wenn die durch das Argument dargestellte Zeichenfolge ein Präfix der durch diese Zeichenfolge dargestellten Zeichenfolge ist; sonst falsch. Beachten Sie auch, dass true zurückgegeben wird, wenn das Argument eine leere Zeichenfolge ist oder diesem Zeichenfolgenobjekt entspricht, wie durch die Methode equals (Object) bestimmt.
Java String.startsWith
quelle
Ich beginne mit einer verwandten Tatsache, die leichter zu verstehen ist.
Die leere Menge ist eine Teilmenge jeder Menge.
Warum? Die Definition der Teilmenge gibt an, dass
A
es sich um eine Teilmenge handelt,B
wenn jedes Element vonA
ein Element von istB
. UmgekehrtA
ist keine Teilmenge von,B
wenn es ein Element gibtA
, das kein Element von istB
.Korrigieren Sie jetzt einen Satz
B
. Ich werde feststellen, dass die leere Menge eine Teilmenge von istB
. Ich werde dies tun, indem ich zeige, dass es nicht so ist, dass die leere Menge keine Teilmenge von istB
. Wenn die leere Menge keine Teilmenge von wäre,B
könnte ich ein Element der leeren Menge finden, das nicht enthalten istB
. Aber die leere Menge hat keine Elemente und daher kann ich kein Element finden, das nicht in istB
. Daher ist es nicht der Fall, dass die leere Menge keine Teilmenge von istB
. Daher muss die leere Menge eine Teilmenge von seinB
.Jede Zeichenfolge beginnt mit der leeren Zeichenfolge.
Zunächst müssen wir uns auf unsere Definition von Starts mit einigen . Lass
s
undt
seistring
s Wir sagen, dass dass
mitt
if beginnts.Length >= t.Length
und die erstent.Length
Zeichent
mit denen von übereinstimmens
. Das heißt,s.Length >= t.Length
und für jeden ,Int32 index
so dass0 <= index < t.Length
,s[index] == t[index]
wahr ist . Umgekehrt würden wir sagen, dasss
das nicht mitt
der Aussage beginnts.Length < t.Length
oders.Length >= t.Length
und es gibt eineInt32 index
solche, dass0 <= index < t.Length
unds[index] != t[index]
ist wahr. Ist im Klartext
s
kürzer alst
oder, falls nicht, gibt es ein Zeichen, dast
nicht mit dem Zeichen an derselben Position übereinstimmts
.Korrigieren Sie nun eine Zeichenfolge
s
. Ich werde feststellen, dass diess
mit der leeren Zeichenfolge beginnt. Ich werde dies tun, indem ich zeige, dass es nicht der Fall ist,s
der nicht mit der leeren Zeichenfolge beginnt. Wenns
nicht mit der leeren Zeichenfolge beginnt, danns.Length < String.Empty.Length
oders.Length >= String.Empty.Length
und es gibt eineInt32 index
solche, dass0 <= index < String.Empty.Length
. Abers.Length >= 0
undString.Empty.Length
ist gleich Null, so dass es unmöglich ists.Length < String.Empty.Length
, wahr zu sein. In ähnlicher Weise, da `` String.Empty.Lengthis equal to zero, there is no
Int32 Indexsatisfying
0 <= Index <String.Empty.Length`. Deshalbs.Length < String.Empty.Length
oders.Length >= String.Empty.Length
und es gibt eineInt32 index
solche, dass0 <= index < String.Empty.Length
ist falsch. Daher ist es nicht der Fall, dass
s
nicht mit der leeren Zeichenfolge begonnen wird. Dahers
muss mit der leeren Zeichenfolge beginnen.Das Folgende ist eine Implementierung von Starts mit codiert als Erweiterung von
string
.Die obigen zwei fettgedruckten Tatsachen sind Beispiele für vakuumgetreue Aussagen . Sie sind wahr aufgrund der Tatsache, dass die Aussagen, die sie definieren ( Teilmenge und Beginn mit ), universelle Quantifizierungen über leere Universen sind. Es gibt keine Elemente in der leeren Menge, daher kann es keine Elemente der leeren Menge geben, die nicht in einer anderen festen Menge enthalten sind. Die leere Zeichenfolge enthält keine Zeichen, daher kann es kein Zeichen geben, da eine Position in der leeren Zeichenfolge nicht mit dem Zeichen an derselben Position in einer anderen festen Zeichenfolge übereinstimmt.
quelle
Lass uns einfach sagen
"abcd".StartsWith("")
gibt false zurück.Wenn ja, was bedeutet der folgende Ausdruck, wahr oder falsch:
es stellt sich heraus, dass evals true ist, also beginnt die Zeichenfolge mit der leeren Zeichenfolge ;-) oder mit anderen Worten, der Teilstring von "abcd", der an Position 0 beginnt und eine Länge von 0 hat, entspricht der leeren Zeichenfolge "". Ziemlich logisch imo.
quelle
null
es ein ebenso angemessener Rückgabewert gewesen wäre.In C # sagt die Spezifikation, dass es reagieren soll;
quelle
DIE WIRKLICHE ANTWORT:
Es muss so sein, sonst hätten Sie den Fall wo
und dann hätten wir wieder Y2K, weil all die Bankensoftware, die von gleichen Zeichenfolgen abhängt, die mit sich selbst beginnen, unsere Konten durcheinander bringt und plötzlich Bill Gates mein Vermögen hat und ich seins haben würde, und verdammt! Das Schicksal ist einfach nicht so nett zu mir.
quelle
Die ersten N Zeichen der beiden Zeichenfolgen sind identisch. N ist die Länge der zweiten Zeichenkette, dh Null.
quelle
Ruft nur für den Datensatz
String.StartsWith()
intern die Methode aufSystem.Globalization.CultureInfo.IsPrefix()
, die die folgende Überprüfung explizit durchführt:quelle
Weil eine Zeichenfolge gut mit "nichts" beginnt.
quelle
Wenn Sie es in regulären Ausdrücken betrachten, ist es sinnvoll. Jede Zeichenfolge (nicht nur "abcd", sondern auch "" und "sdf \ nff") gibt true zurück, wenn der reguläre Ausdruck "beginnt mit leerer Zeichenfolge" ausgewertet wird.
quelle