Pergunta

Título é toda a questão. Alguém pode me dar uma razão por que isso acontece?

Foi útil?

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.

.NET String.StartsWith

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).

Java String.StartsWith

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 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 strings 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 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 noInt32 indexsatisfying0 <= índice

s.Length < String.Empty.Length ou s.Length >= String.Empty.Length e há uma Int32 index tal que 0 <= index < String.Empty.Length

é falsa. Portanto, não é o caso que s não começa com a cadeia vazia. Assim, s deve começar com a cadeia vazia.

A seguir é uma implementação do começa com codificados como uma extensão para 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;
}

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.

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;
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top