O título é toda a questão. Alguém pode me dar um motivo para isso acontecer?
c#
java
startswith
Dested
fonte
fonte
Vou tentar elaborar o que Jon Skeet disse.
Digamos que x, y e z sejam strings e o operador + seja de fato concatenação, então:
Se pudermos dividir z para escrever z = x + y, isso significa que z começa com x. Como toda string z pode ser dividida em z = "" + z, segue-se que toda string começa com "".
Portanto, como ("" + "abcd") == "abcd" segue-se que "abcd" começa com ""
fonte
Este método compara o parâmetro value com a substring no início desta string que tem o mesmo comprimento que value e retorna um valor que indica se eles são iguais. Para ser igual, o valor deve ser uma string vazia (Vazio), uma referência a esta mesma instância ou corresponder ao início desta instância.
.NET String.StartsWith
true se a seqüência de caracteres representada pelo argumento for um prefixo da seqüência de caracteres representada por esta string; caso contrário, false. Observe também que true será retornado se o argumento for uma string vazia ou igual a este objeto String, conforme determinado pelo método equals (Object).
Java String.startsWith
fonte
Vou começar com um fato relacionado que é mais fácil de entender.
O conjunto vazio é um subconjunto de cada conjunto.
Por quê? A definição de subconjunto indica que
A
é um subconjunto deB
se cada elemento deA
for um elemento deB
. Por outro lado,A
não é um subconjunto de,B
se houver um elemento deA
que não seja um elemento deB
.Agora conserte um conjunto
B
. Vou estabelecer que o conjunto vazio é um subconjunto deB
. Farei isso mostrando que não é o caso em que o conjunto vazio não é um subconjunto deB
. Se o conjunto vazio não fosse um subconjunto deB
, eu poderia encontrar um elemento do conjunto vazio que não está emB
. Mas o conjunto vazio não possui nenhum elemento e, portanto, não consigo encontrar um elemento que não esteja emB
. Portanto, não é o caso de que o conjunto vazio não seja um subconjunto deB
. Portanto, o conjunto vazio deve ser um subconjunto deB
.Qualquer string começa com uma string vazia.
Primeiro, devemos concordar em nossa definição de começa com . Let
s
andt
bestring
s Dizemos ques
começa comt
ses.Length >= t.Length
e os primeirost.Length
caracteres det
correspondem aos des
. Isso é,s.Length >= t.Length
e para tudoInt32 index
isso0 <= index < t.Length
,s[index] == t[index]
é verdade. Por outro lado, diríamos ques
não começa comt
se a declaraçãos.Length < t.Length
ous.Length >= t.Length
e existeInt32 index
tal que0 <= index < t.Length
es[index] != t[index]
é verdade. Em português simples,
s
é menor quet
ou, se não, existe um caractere emt
não corresponder ao caractere da mesma posição ems
.Agora conserte uma corda
s
. Vou estabelecer ques
começa com a string vazia. Farei isso mostrando que não é o caso des
não começar com a string vazia. Ses
não começar com a string vazia, entãos.Length < String.Empty.Length
ous.Length >= String.Empty.Length
e existeInt32 index
tal que0 <= index < String.Empty.Length
. Mass.Length >= 0
eString.Empty.Length
é igual a zero, então é impossívels.Length < String.Empty.Length
ser verdade. Da mesma forma, como `` String.Empty.Lengthis equal to zero, there is no
Int32 indexsatisfying
0 <= index <String.Empty.Length`. Portantos.Length < String.Empty.Length
ous.Length >= String.Empty.Length
e existeInt32 index
tal que0 <= index < String.Empty.Length
é falso. Portanto, não é o caso de
s
não começar com a string vazia. Portanto,s
deve começar com a string vazia.A seguir está uma implementação de starts with codificado como uma extensão 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; }
Os dois fatos em negrito acima são exemplos de afirmações vagamente verdadeiras . Eles são verdadeiros em virtude do fato de que as afirmações que os definem ( subconjunto e começa com ) são quantificações universais sobre universos vazios. Não há elementos no conjunto vazio, portanto não pode haver nenhum elemento do conjunto vazio que não esteja em algum outro conjunto fixo. Não há caracteres na string vazia, então não pode haver um caractere como alguma posição na string vazia que não corresponda ao caractere na mesma posição em alguma outra string fixa.
fonte
Digamos que
"abcd".StartsWith("")
retorna falso.em caso afirmativo, o que significa a seguinte expressão, verdadeiro ou falso:
("abcd".Substring(0,0) == "")
Acontece que evals para true, então a string começa com a string vazia ;-), ou em outras palavras, a substring de "abcd" começando na posição 0 e tendo comprimento 0 é igual à string vazia "". Muito lógico, sim.
fonte
null
seria um valor de retorno igualmente apropriado.Em C #, é assim que a especificação o instrui a reagir;
fonte
Os primeiros N caracteres das duas strings são idênticos. N sendo o comprimento da segunda corda, ou seja, zero.
fonte
A REAL RESPOSTA:
Tem que ser assim, caso contrário, você teria o caso em que
"".startsWith("") == false "".equals("") == true but yet "a".startsWith("a") == true "a".equals("a") == true
e então teríamos o Y2K novamente, porque todo o software do banco que depende de cordas iguais começando com eles mesmos vai misturar nossas contas e de repente Bill Gates terá minha riqueza e eu teria a dele, e dane-se! O destino simplesmente não é tão bom para mim.
fonte
Apenas para registro,
String.StartsWith()
chama internamente o métodoSystem.Globalization.CultureInfo.IsPrefix()
que faz a seguinte verificação explicitamente:if (prefix.Length == 0) { return true; }
fonte
Porque uma string começa bem com "nada".
fonte
Se você pensar nisso em termos de expressões regulares, faz sentido. Cada string (não apenas "abcd", também "" e "sdf \ nff"), retorna verdadeiro ao avaliar a expressão regular de 'começa com string vazia'.
fonte