El título es toda la pregunta. ¿Puede alguien darme una razón por la que esto sucede?¿Por qué "abcd" .StartsWith ("") devuelve verdadero?
Respuesta
Sí - ya que comienzan con la cadena vacía. De hecho, la cadena vacía se produce lógicamente entre cada par de caracteres.
Ponlo de esta manera: ¿qué definición de "comienza con" podrías dar que excluiría esto? Aquí hay una definición simple de "comienza con" que no:
"x comienza con y si los primeros caracteres y.Length
de x coinciden con los de y".
Una alternativa (equivalente) Definición:
"x comienza con Y si x.Substring(0, y.Length).Equals(y)
"
Este método compara el parámetro de valor con la subcadena al comienzo de esta cadena que tiene la misma longitud que el valor, y devuelve un valor que indica si son iguales. Para ser iguales, el valor debe ser una cadena vacía (Vacío), una referencia a esta misma instancia, o debe coincidir con el comienzo de esta instancia.
cierto si la secuencia de caracteres representado 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 true se devolverá 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).
Los primeros N caracteres de las dos cadenas son idénticas. N es la longitud de la segunda cuerda, es decir, cero.
En C# así es como el specification le dice que reaccione;
Para ser iguales, el valor debe ser una cadena vacía (Vacío), una referencia a esta misma instancia, o debe coincidir con el comienzo de esta instancia.
Porque una cuerda comienza bien con "nada".
... eso es si string.empty no es nada! Esta simplificación excesiva no puede generalizarse. Sugiero que sigamos las discusiones más orientadas a la teoría de conjuntos. –
Si lo piensas 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 cadena vacía'.
Trataré de explicar lo que dijo Jon Skeet.
Digamos que x, y, z son las cadenas y el operador + es, de hecho, la concatenación, entonces:
Si podemos dividir z escribir z = x + y eso significa que comienza con z x. Como cada cadena z se puede dividir en z = "" + z, se deduce que cada cadena comienza con "".
Por lo tanto, debido a que ("" + "ABCD") == "ABCD" se deduce que "ABCD" comienza con ""
¿Cómo se puede explicar a Jon Skeet? – devSolo
Bueno, tienes razón. "elaborado - Para expresar con mayor detalle o en mayor detalle". No agregué mucho (si acaso) a lo que dijo Jon. Es mi inglés, supongo. O no soy lo suficientemente humilde ;-) –
Estaba haciendo una broma de Jon Skeet. Me disculpo por causar la confusión. – devSolo
Digamos "abcd".StartsWith("")
vuelve falsa.
si es así, ¿qué eval a la siguiente expresión, verdadero o falso:
("abcd".Substring(0,0) == "")
resulta que a evals cierto, por lo que la cadena se pone en marcha con la cadena vacía ;-), o poner en en otras palabras, la subcadena de "abcd" que comienza en la posición 0 y tiene 0 de longitud es igual a la cadena vacía "". Muy lógico imo.
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é? El definition de subconjunto indica que A
es un subconjunto de B
si cada elemento de A
es un elemento de B
. Por el contrario, A
no es un subconjunto de B
si hay un elemento de A
que no es un elemento de B
.
Ahora arregle un conjunto B
. Estableceré que el conjunto vacío es un subconjunto de B
. Haré esto mostrando que no es el caso que el conjunto vacío no sea un subconjunto de B
. Si el conjunto vacío no fuera un subconjunto de B
, entonces podría encontrar un elemento del conjunto vacío que no está en B
. Pero el conjunto vacío no tiene ningún elemento y, por lo tanto, no puedo encontrar un elemento que no esté en B
. Por lo tanto, no es el caso que el conjunto vacío no sea un subconjunto de B
. Por lo tanto, el conjunto vacío debe ser un subconjunto de B
.
Cualquier cadena comienza con la cadena vacía.
Primero, debemos estar de acuerdo con nuestra definición de que comienza con. Vamos s
y t
ser string
s Decimos que s
comienza cont
si s.Length >= t.Length
y los primeros caracteres del t.Length
t
coinciden con los de s
. Es decir, s.Length >= t.Length
y para cada Int32 index
tal que 0 <= index < t.Length
, s[index] == t[index]
es verdadero. Por el contrario, diremos que s
no se inicia con t
si la declaración
s.Length < t.Length
o s.Length >= t.Length
y hay una Int32 index
tal que 0 <= index < t.Length
y s[index] != t[index]
es cierto. En inglés simple, s
es más corto que t
, o, si no, hay un carácter en t
que no coincide con el carácter como la misma posición en s
.
Ahora arregle una cadena s
. Estableceré que s
comienza con la cadena vacía. Haré esto mostrando que no es el caso que s
no comience con la cadena vacía. Si s
no comienza con la cadena vacía, entonces s.Length < String.Empty.Length
o s.Length >= String.Empty.Length
y hay un Int32 index
tal que 0 <= index < String.Empty.Length
. Pero s.Length >= 0
y String.Empty.Length
es igual a cero, por lo que es imposible que s.Length < String.Empty.Length
sea verdadero. Del mismo modo, desde `` String.Empty.Longitud is equal to zero, there is no
Int32 índice = índice < String.Empty.Length`. Por lo tanto
s.Length < String.Empty.Length
o s.Length >= String.Empty.Length
y hay un Int32 index
tal que 0 <= 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 que comienza con codificada 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 vacuously true statements. Son verdaderos en virtud del hecho de que las declaraciones que los definen (subconjunto y comienza con) son universal quantifications en universos vacíos. No hay elementos en el conjunto vacío, por lo que no puede haber ningún elemento del conjunto vacío en ningún otro conjunto fijo. No hay caracteres en la cadena vacía, por lo que no puede haber un carácter como posición en la cadena vacía que no coincida con el carácter en la misma posición en alguna otra cadena fija.
Sólo para que conste, String.StartsWith()
llama internamente al método System.Globalization.CultureInfo.IsPrefix()
que hace que la siguiente lista de comprobaciones de forma explícita:
if (prefix.Length == 0)
{
return true;
}
¿Por qué “ABCD” .StartsWith (“”) devuelven true?
la respuesta real:
Tiene que ser así de lo contrario usted tendría el caso en que
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
y entonces tendríamos Y2K todo de nuevo porque todo el banco el software que depende de cadenas iguales comenzando por ellos mismos hará que nuestras cuentas se mezclen y, de repente, Bill Gates tendrá mi riqueza y yo la suya, ¡y maldita sea! El destino simplemente no es tan bueno para mí.
En C#, la razón por la que devuelve true
es que los desarrolladores la codificaron específicamente.
Si compruebas el source code, encontrará lógica específica para manejar una cadena vacía:
public Boolean StartsWith(String value)
{
return StartsWith(value, StringComparison.CurrentCulture);
}
public Boolean StartsWith(String value, StringComparison comparisonType)
{
...
if (value.Length == 0)
{
return true;
}
- 1. ¿Por qué esta expresión devuelve verdadero?
- 2. ReferenceEquals ¿Por qué (S1, S2) devuelve verdadero
- 3. ¿Por qué .find() siempre devuelve verdadero?
- 4. SecurityElement.IsValidText devuelve verdadero en "&" ... ¿por qué?
- 5. ¿Por qué veo este comportamiento inesperado de StartsWith de .NET?
- 6. ¿Por qué $ ('# id') devuelve verdadero si el id no existe?
- 7. ¿En qué circunstancias devuelve TextToSpeech.isSpeaking() verdadero?
- 8. isAvailableForServiceType siempre devuelve verdadero?
- 9. ScaleGestureDetector.onTouchEvent siempre devuelve 'verdadero'
- 10. Android wifimanager siempre devuelve verdadero
- 11. ¿Por qué ISNUMERIC ('.') Devuelve 1?
- 12. ¿Qué tan bueno es startswith?
- 13. correo() falla, pero devuelve verdadero
- 14. Javascript regex devuelve verdadero ... luego falso ... luego verdadero ... etc.
- 15. ¿Devuelve verdadero/falso en el servicio REST?
- 16. VBScript Dictionary Existe método Siempre devuelve verdadero
- 17. ¿Por qué arrayAppend devuelve true y listAppend devuelve la lista?
- 18. ValidateCredentials devuelve verdadero para un usuario desconocido?
- 19. ¿Por qué 0 == "" verdadero en JavaScript
- 20. ¿Por qué == verdadero para algunos objetos enteros?
- 21. LINQ - Ordenar por StartsWith contiene entonces
- 22. IsAssignableFrom() devuelve falso cuando debería devolver verdadero
- 23. Android - ¿Por qué onItemLongClick (...) devuelve un booleano?
- 24. ¿Por qué mi identificador de archivo bendecido de Perl no devuelve verdadero con `can ('print')` '?
- 25. ¿Por qué Request.IsSecureConnection devuelve falso cuando se espera que sea verdadero
- 26. En Java XOR con tres entradas verdaderas devuelve verdadero. ¿Por qué?
- 27. ¿Por qué Html.Checkbox ("Visible") devuelve "verdadero, falso" en ASP.NET MVC 2?
- 28. ¿Por qué Smartmatch devuelve verdadero al comparar segmentos de matriz que deberían ser diferentes?
- 29. ¿Por qué Javascript O devuelve un valor que no sea verdadero/falso?
- 30. ¿Por qué resolveBinding() devuelve null a pesar de que establecí ResolucionesResultadas (verdadero) en mi ASTParser?
x comienza con Y si x.Substring (0), y.Length .equals (y) si y solo si y.Length> 0 –
Sí, de hecho podría excluir explícitamente este caso. Sin embargo, es una definición bastante poco elegante, ¿no? –
Jon, básicamente, su afirmación requiere "y.Length <= x.Length &&" o arrojará un IndexOutOfRangeException;) –