Le titre est toute la question. Quelqu'un peut-il me donner une raison pour laquelle cela se produit?
c#
java
startswith
Dested
la source
la source
Je vais essayer de développer ce que Jon Skeet a dit.
Disons que x, y et z sont des chaînes et que l'opérateur + est en fait une concaténation, alors:
Si nous pouvons diviser z pour écrire z = x + y, cela signifie que z commence par x. Comme chaque chaîne z peut être divisée en z = "" + z, il s'ensuit que chaque chaîne commence par "".
Donc, parce que ("" + "abcd") == "abcd" il s'ensuit que "abcd" commence par ""
la source
Cette méthode compare le paramètre value à la sous-chaîne au début de cette chaîne qui a la même longueur que value et retourne une valeur qui indique si elles sont égales. Pour être égale, la valeur doit être une chaîne vide (Vide), une référence à cette même instance ou correspondre au début de cette instance.
.NET String.StartsWith
true si la séquence de caractères représentée par l'argument est un préfixe de la séquence de caractères représentée par cette chaîne; faux sinon. Notez également que true sera retourné si l'argument est une chaîne vide ou est égal à cet objet String tel que déterminé par la méthode equals (Object).
Java String.startsWith
la source
Je vais commencer par un fait connexe qui est plus facile à comprendre.
L'ensemble vide est un sous-ensemble de chaque ensemble.
Pourquoi? La définition de sous - ensemble indique qui
A
est un sous-ensemble deB
si chaque élément deA
est un élément deB
. Inversement,A
n'est pas un sous-ensemble deB
s'il y a un élément deA
qui n'est pas un élément deB
.Maintenant, corrigez un ensemble
B
. Je vais établir que l'ensemble vide est un sous-ensemble deB
. Je vais le faire en montrant que ce n'est pas le cas que l'ensemble vide ne soit pas un sous-ensemble deB
. Si l'ensemble vide n'était pas un sous-ensemble de,B
je pourrais trouver un élément de l'ensemble vide qui n'est pas dansB
. Mais l'ensemble vide ne contient aucun élément et je ne peux donc pas trouver un élément qui ne soit pas dedansB
. Par conséquent, il n'est pas vrai que l'ensemble vide ne soit pas un sous-ensemble deB
. Ainsi, l'ensemble vide doit être un sous-ensemble deB
.Toute chaîne commence par la chaîne vide.
Premièrement, nous devons nous entendre sur notre définition de commence par . Let
s
andt
bestring
s On dit que ças
commence part
ifs.Length >= t.Length
et les premierst.Length
caractères det
correspondent à ceux des
. C'est vrai,s.Length >= t.Length
et pour toutInt32 index
cela0 <= index < t.Length
,s[index] == t[index]
c'est vrai. À l'inverse, nous dirions ques
cela ne commence pas part
si l'instructions.Length < t.Length
ous.Length >= t.Length
et il y a unInt32 index
tel que0 <= index < t.Length
ets[index] != t[index]
est vrai. En anglais simple,
s
est plus court quet
, sinon, il y a un caractère quit
ne correspond pas au caractère à la même position danss
.Maintenant, corrigez une chaîne
s
. Je vais établir ques
commence par la chaîne vide. Je vais le faire en montrant que ce n'est pas le cas quis
ne commence pas par la chaîne vide. Sis
ne démarre pas avec la chaîne vide,s.Length < String.Empty.Length
ous.Length >= String.Empty.Length
et il y a uneInt32 index
telle que0 <= index < String.Empty.Length
. Maiss.Length >= 0
etString.Empty.Length
est égal à zéro, il est donc impossibles.Length < String.Empty.Length
d'être vrai. De même, depuis `` String.Empty.Lengthis equal to zero, there is no
Int32 indexsatisfying
0 <= index <String.Empty.Length`. Doncs.Length < String.Empty.Length
ous.Length >= String.Empty.Length
et il y a unInt32 index
tel que0 <= index < String.Empty.Length
c'est faux. Par conséquent, ce n'est pas le cas qui
s
ne commence pas par la chaîne vide. Ainsi,s
doit commencer par la chaîne vide.Ce qui suit est une implémentation de commence par codé comme une extension de
string
.public static bool DoStartsWith(this string s, string t) { if (s.Length >= t.Length) { for (int index = 0; index < t.Length; index++) { if (s[index] != t[index]) { return false; } } return true; } return false; }
Les deux faits en gras ci-dessus sont des exemples d' énoncés vaguement vrais . Elles sont vraies en vertu du fait que les énoncés les définissant ( sous - ensemble et commence par ) sont des quantifications universelles sur des univers vides. Il n'y a aucun élément dans l'ensemble vide, donc il ne peut y avoir aucun élément de l'ensemble vide pas dans un autre ensemble fixe. Il n'y a aucun caractère dans la chaîne vide, donc il ne peut pas y avoir de caractère car une position dans la chaîne vide ne correspond pas au caractère à la même position dans une autre chaîne fixe.
la source
Disons simplement que
"abcd".StartsWith("")
renvoie false.si tel est le cas, qu'est-ce que l'expression suivante évalue, true ou false:
("abcd".Substring(0,0) == "")
il s'avère que l'évalue à true, donc la chaîne commence par la chaîne vide ;-), ou met en d'autres termes, la sous-chaîne de "abcd" commençant à la position 0 et ayant une longueur de 0 égale la chaîne vide "". Imo assez logique.
la source
null
aurait été une valeur de retour tout aussi appropriée.En C #, c'est ainsi que la spécification lui dit de réagir;
la source
Les N premiers caractères des deux chaînes sont identiques. N étant la longueur de la deuxième chaîne, c'est-à-dire zéro.
la source
LA VRAIE RÉPONSE:
Il doit en être ainsi sinon vous auriez le cas où
"".startsWith("") == false "".equals("") == true but yet "a".startsWith("a") == true "a".equals("a") == true
et puis nous aurions à nouveau l'an 2000 parce que tous les logiciels bancaires qui dépendent de chaînes égales commençant par eux-mêmes mélangeront nos comptes et soudain, Bill Gates aura ma richesse et j'aurai la sienne, et bon sang! Le destin n'est pas ce genre de chose pour moi.
la source
Pour mémoire,
String.StartsWith()
appelle en interne la méthodeSystem.Globalization.CultureInfo.IsPrefix()
qui effectue explicitement la vérification suivante:if (prefix.Length == 0) { return true; }
la source
Parce qu'une chaîne commence bien par "rien".
la source
Si vous pensez à cela en termes d'expressions régulières, cela a du sens. Chaque chaîne (pas seulement «abcd», mais également «» et «sdf \ nff»), renvoie true lors de l'évaluation de l'expression régulière de «commence par une chaîne vide».
la source