Por que “abcd” .StartsWith ( “”) return true?
-
02-07-2019 - |
Pergunta
Título é toda a questão. Alguém pode me dar uma razão por que isso acontece?
Solução
Sim - porque não começar com a cadeia vazia. De fato, a cadeia vazia logicamente ocorre entre cada par de caracteres.
Coloque-o desta forma: o que definição de "começa com" você poderia dar que impediria isso? Aqui está uma definição simples de "começa com" que não:
"x começa com y se os primeiros caracteres y.Length
de x correspondem aos do y."
Uma alternativa (equivalente) definição:
"x começa com y se x.Substring(0, y.Length).Equals(y)
"
Outras dicas
Vou tentar elaborar sobre o que Jon Skeet disse.
Vamos digamos x, y e z são strings e + operador é, de facto, concatenação, então:
Se podemos dividir z para escrever z = x + y Isso significa que z começa com x. Porque cada corda z pode ser dividida para z = "" + z segue-se que a cada string começa com "".
Assim, porque ( "" + "abcd") == "abcd" segue-se que "abcd" começa com ""
Este método compara o parâmetro de valor para a substring no início desta cadeia que é o mesmo comprimento que o valor, e retorna um valor que indica se eles são iguais. Para ser igual, o valor deve ser uma cadeia vazia (vazio), uma referência a esta mesma instância, ou combinar com o começo desta instância.
true se a seqüência de caracteres representado pelo argumento é um prefixo do seqüência de caracteres representada por essa string; false caso contrário. Nota também que a verdadeira será devolvido se o argumento for uma cadeia vazia ou é igual a este objeto String como determinado pelo método equals (Object).
Vou começar com um fato relacionado que é mais fácil de entender.
Por quê? A definição de subconjunto estados que A
é um subconjunto de B
se cada elemento de A
é um elemento de B
. Por outro lado, A
não é um subconjunto de B
se há um elemento de A
que não é um elemento de B
.
Agora corrigir um B
set. Vou estabelecer que o conjunto vazio é um subconjunto de B
. Eu vou fazer isso, mostrando que não é o caso de que o conjunto vazio não é um subconjunto de B
. Se o conjunto vazio não eram um subconjunto de B
então poderia encontrar um elemento do conjunto vazio que não é em B
. Mas o conjunto vazio não tem quaisquer elementos e, portanto, não consigo encontrar um elemento que não está na B
. Portanto, não é o caso de que o conjunto vazio não é um subconjunto de B
. Assim, o conjunto vazio deve ser um subconjunto de B
.
Qualquer string começa com a cadeia vazia.
Primeiro, devemos concordar com a nossa definição de começa com . Vamos s
e t
ser string
s Dizemos que s
começa com t
se s.Length >= t.Length
eo primeiro t.Length
personagens de t
coincidir com os de s
. Ou seja, s.Length >= t.Length
e para cada Int32 index
tal que 0 <= index < t.Length
, s[index] == t[index]
é verdade. Por outro lado, diríamos que s
não começa com t
se a declaração
s.Length < t.Length
ou s.Length >= t.Length
e há uma Int32 index
tal que 0 <= index < t.Length
e s[index] != t[index]
é verdade. Na planície Inglês, s
é menor do que t
, ou, se não, há um personagem em t
não coincida com o personagem como a mesma posição na s
.
Agora corrigir um é falsa. Portanto, não é o caso que A seguir é uma implementação do começa com codificados como uma extensão para O acima de dois fatos em negrito são exemplos de declarações vacuously verdadeiros . Eles são verdadeiras em virtude do fato de que as demonstrações defini-los ( subconjunto e começa com ) são quantificações universais universos mais vazias. Não existem elementos no conjunto vazio, então não pode haver quaisquer elementos do conjunto vazio não em algum outro conjunto fixo. Não há caracteres na string vazia, então não pode haver um personagem como alguns posição na cadeia vazia não matching o personagem na mesma posição em alguma outra corda fixa. s
string. Vou estabelecer que começa s
com a cadeia vazia. Eu vou fazer isso, mostrando que não é o caso que s
não começa com a cadeia vazia. Se s
não começa com a cadeia vazia, em seguida, s.Length < String.Empty.Length
ou s.Length >= String.Empty.Length
e há uma Int32 index
tal que 0 <= index < String.Empty.Length
. Mas s.Length >= 0
e String.Empty.Length
é igual a zero, por isso é impossível para s.Length < String.Empty.Length
para ser verdade. Da mesma forma, uma vez que `` String.Empty.Lengthis equal to zero, there is no
Int32 indexsatisfying
0 <= índice s.Length < String.Empty.Length
ou s.Length >= String.Empty.Length
e há uma Int32 index
tal que 0 <= index < String.Empty.Length
s
não começa com a cadeia vazia. Assim, s
deve começar com a cadeia vazia. 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;
}
Vamos apenas dizer "abcd".StartsWith("")
retorna falso.
Se sim, então o que faz o seguinte eval expressão, verdadeiro ou falso:
("abcd".Substring(0,0) == "")
verifica-se que evals a verdade, então a string não começar com a cadeia vazia ;-), ou colocar em outras palavras, a substring de "abcd" começando na posição 0 e tendo comprimento 0 é igual a uma string vazia "" . Bastante lógico imo.
Em C # é assim que a especificação diz-lhe para reagir;
Para ser igual, o valor deve ser uma cadeia vazia (vazio), uma referência a esta mesma instância, ou combinar com o começo desta instância.
Por que “abcd” .StartsWith ( “”) return true?
A verdadeira resposta:
Tem que ser assim se não você teria caso onde
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
e, em seguida, teríamos Y2K tudo de novo, porque todo o software de banco que depende iguais cordas começando com si vai chegar em nossas contas misturado e de repente Bill Gates terá a minha riqueza e eu tenho dele, e dane-se ! O destino não é tão bom para mim.
Os primeiros caracteres N das duas cadeias são idênticos. N sendo o comprimento da segunda cadeia, isto é, zero.
Apenas para o registro, String.StartsWith()
chama internamente o System.Globalization.CultureInfo.IsPrefix()
método que faz a seguinte verificação explicitamente:
if (prefix.Length == 0)
{
return true;
}
Como uma string começa bem com "nada".
Se você pensar sobre isso em termos expressões regulares, faz sentido. Cada string (não apenas "ABCD", também "" e "sdf \ NFF"), retorna verdadeiro quando se avalia a expressão regular de 'começa com string vazia'.
Em C #, a razão ele retorna true
é que os desenvolvedores especificamente codificado para ele.
Se você verificar o código fonte , você' vai encontrar lógica específica para lidar com uma cadeia vazia:
public Boolean StartsWith(String value)
{
return StartsWith(value, StringComparison.CurrentCulture);
}
public Boolean StartsWith(String value, StringComparison comparisonType)
{
...
if (value.Length == 0)
{
return true;
}