El título es toda la pregunta. ¿Alguien puede darme una razón por la que sucede esto?
c#
java
startswith
Dested
fuente
fuente
Intentaré dar más detalles sobre lo que dijo Jon Skeet.
Digamos que x, y y z son cadenas y el operador + es de hecho una concatenación, entonces:
Si podemos dividir z para escribir z = x + y eso significa que z comienza con x. Debido a que cada cadena z se puede dividir en z = "" + z, se deduce que cada cadena comienza con "".
Entonces, debido a que ("" + "abcd") == "abcd" se sigue que "abcd" comienza con ""
fuente
Este método compara el parámetro de valor con la subcadena al comienzo de esta cadena que tiene la misma longitud que valor y devuelve un valor que indica si son iguales. Para ser igual, el valor debe ser una cadena vacía (Vacío), una referencia a esta misma instancia o coincidir con el comienzo de esta instancia.
.NET String.StartsWith
Verdadero si la secuencia de caracteres representada por el argumento es un prefijo de la secuencia de caracteres representada por esta cadena; falso de lo contrario. Tenga en cuenta también que se devolverá verdadero si el argumento es una cadena vacía o es igual a este objeto String según lo determinado por el método equals (Object).
Java String.startsWith
fuente
Comenzaré con un hecho relacionado que es más fácil de entender.
El conjunto vacío es un subconjunto de cada conjunto.
¿Por qué? La definición de subconjunto establece que
A
es un subconjunto deB
si cada elemento deA
es un elemento deB
. Por el contrario,A
no es un subconjunto deB
si hay un elemento deA
que no es un elemento deB
.Ahora arregle un juego
B
. Estableceré que el conjunto vacío es un subconjunto deB
. Haré esto mostrando que no es el caso de que el conjunto vacío no sea un subconjunto deB
. Si el conjunto vacío no fuera un subconjunto deB
, podría encontrar un elemento del conjunto vacío que no está incluidoB
. Pero el conjunto vacío no tiene ningún elemento y, por lo tanto, no puedo encontrar un elemento que no esté enB
. Por lo tanto, no es el caso de que el conjunto vacío no sea un subconjunto deB
. Por tanto, el conjunto vacío debe ser un subconjunto deB
.Cualquier cadena comienza con la cadena vacía.
Primero, debemos estar de acuerdo con nuestra definición de comienza con . Let
s
andt
bestring
s Decimos ques
comienza cont
sis.Length >= t.Length
y los primerost.Length
caracteres det
coinciden con los des
. Eso es,s.Length >= t.Length
y para todoInt32 index
eso0 <= index < t.Length
,s[index] == t[index]
es cierto. Por el contrario, diríamos ques
no comienza cont
si la declaracións.Length < t.Length
os.Length >= t.Length
y hayInt32 index
tal que0 <= index < t.Length
ys[index] != t[index]
es verdad. En inglés simple,
s
es más corto quet
, o, en caso contrario, hay un carácter quet
no coincide con el carácter de la misma posición ens
.Ahora arregle una cuerda
s
. Estableceré ques
comienza con la cadena vacía. Haré esto mostrando que no es el caso ques
no comienza con la cadena vacía. Sis
no comienza con la cadena vacía, entoncess.Length < String.Empty.Length
os.Length >= String.Empty.Length
y hayInt32 index
tal que0 <= index < String.Empty.Length
. Peros.Length >= 0
yString.Empty.Length
es igual a cero, por lo que es imposibles.Length < String.Empty.Length
que sea cierto. Del mismo modo, desde `` String.Empty.Lengthis equal to zero, there is no
Int32 indexsatisfying
0 <= index <String.Empty.Length`. Por lo tantos.Length < String.Empty.Length
os.Length >= String.Empty.Length
y hayInt32 index
tal que0 <= index < String.Empty.Length
Es falso. Por lo tanto, no es el caso que
s
no comience con la cadena vacía. Por lo tanto,s
debe comenzar con la cadena vacía.La siguiente es una implementación de comienza con codificado como una extensión 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; }
Los dos hechos en negrita anteriores son ejemplos de declaraciones vacuasmente verdaderas . Son verdaderas en virtud del hecho de que los enunciados que las definen ( subconjunto y comienza con ) son cuantificaciones universales sobre universos vacíos. No hay elementos en el conjunto vacío, por lo que no puede haber ningún elemento del conjunto vacío ni en algún otro conjunto fijo. No hay caracteres en la cadena vacía, por lo que no puede haber un carácter, ya que alguna posición en la cadena vacía no coincide con el carácter en la misma posición en alguna otra cadena fija.
fuente
Digamos que
"abcd".StartsWith("")
devuelve falso.Si es así, ¿qué hace la siguiente expresión eval, verdadero o falso?
("abcd".Substring(0,0) == "")
resulta que evals a verdadero, por lo que la cadena comienza con la cadena vacía ;-), o en otras palabras, la subcadena de "abcd" que comienza en la posición 0 y tiene una longitud de 0 es igual a la cadena vacía "". En mi opinión bastante lógico.
fuente
null
habría sido un valor de retorno igualmente apropiado.En C # así es como la especificación le dice que reaccione;
fuente
Los primeros N caracteres de las dos cadenas son idénticos. N es la longitud de la segunda cadena, es decir, cero.
fuente
LA RESPUESTA REAL:
Tiene que ser así, de lo contrario, tendrías el caso donde
"".startsWith("") == false "".equals("") == true but yet "a".startsWith("a") == true "a".equals("a") == true
y luego tendríamos Y2K de nuevo porque todo el software bancario que depende de cadenas iguales comenzando por ellos mismos confundirá nuestras cuentas y, de repente, Bill Gates tendrá mi riqueza y yo la suya, ¡y maldita sea! El destino no es tan amable conmigo.
fuente
Solo para el registro,
String.StartsWith()
llama internamente al métodoSystem.Globalization.CultureInfo.IsPrefix()
que realiza la siguiente verificación explícitamente:if (prefix.Length == 0) { return true; }
fuente
Porque una cadena comienza bien con "nada".
fuente
Si lo piensa en términos de expresiones regulares, tiene sentido. Cada cadena (no solo "abcd", también "" y "sdf \ nff"), devuelve verdadero al evaluar la expresión regular de 'comienza con una cadena vacía'.
fuente