2011-01-10 15 views
18

Solo una breve pregunta por curiosidad.¿Las cadenas de C# terminan con un hilo vacío?

string str = "string"; 
Console.WriteLine(str.EndsWith(string.Empty));     //true 
Console.WriteLine(str.LastIndexOf(string.Empty) == str.Length); //false 
//of course string are indexed from 0, 
//just wrote if for fun to check whether empty string get some extra index 
///somehow by a miracle:) 

//finally 

Console.WriteLine(str.LastIndexOf(string.Empty) 
       == str.LastIndexOf('g'));      //true :) 
+0

¿Cuál es su concepto de 'string.Empty'? ¿Qué es? – thecoop

+7

Todo no contiene nada. Nada está en todas partes. – BoltClock

+0

Mi pregunta sería ¿por qué hay tantos votos para una pregunta tan sin sentido? ¿Por qué exactamente importa si uno sabe si una cadena C# termina o no en una cadena vacía? ¿Cómo usarías tal información tan valiosa? – Blake7

Respuesta

17

EndsWith:

determina si el final de la instancia cadena coincide con la cadena especificada.

Todas las cadenas coincidirán "" al final ... o cualquier otro componente de la cadena. ¿Por qué? Porque conceptualmente, hay cadenas vacías alrededor de cada personaje.

"" + "abc" + "" == "abc" == "" + "a" + "" + "b" + "" + "c" + "" 

Actualización:

Sobre el último ejemplo - esto está documentado en LastIndexOf:

Si el valor es String.Empty, el valor de retorno es la última posición del índice en este ejemplo.


Un tema relacionado es el uso de nulo como un terminador de cadena - lo que ocurre en C y C++, C#, pero no.

De MSDN - String Class (System):

En .NET Framework, un objeto de cadena puede incluir caracteres nulos, que cuentan como una parte de la longitud de la cadena incrustada. Sin embargo, en algunos lenguajes como C y C++, un carácter nulo indica el final de una cadena; no se considera una parte de la cadena y no se cuenta como parte de la longitud de la cadena.

6

Prueba esto:

string str = "string"; 
Console.WriteLine(str.EndsWith(string.Empty));     //true 
Console.WriteLine(str.LastIndexOf(string.Empty) == str.Length-1); // true 
Console.ReadLine(); 

Así que sí, como dijo Oded, lo hacen siempre coinciden.

+0

ooh Bueno más uno por tener un sitio crítico en Q? código snippet – Badr

+0

No creo que el código de OP 'str.LastIndexOf (string.Empty) == str.Length' sea un error, ya que OP piensa' string.Empty' es algo después de ** g ** – Bolu

+1

Por supuesto, las cadenas usan indexación basada en 0, simplemente lo escribí por diversión para comprobar si la cadena vacía obtiene algún índice adicional de alguna manera por un milagro :) – nan

2

Piénsalo de esta manera: LastIndexOf es un poco sin sentido con una cadena vacía. Se podría decir que la cadena vacía existe en cada índice dentro de una cadena, entre cada carácter. El documentation proporciona de este modo una respuesta definitiva para lo que debería ser devuelto:

Si el valor es String.Empty, el valor de retorno es la última posición de índice de este caso.

Al menos en este caso se devuelve un índice de real. Si devuelve la longitud de la cadena (que representa el índice "después" del final, que creo que era su punto) devolvería un resultado para un método llamado LastIndexOf que ni siquiera es un índice.

Y aquí hay otra forma de verlo: Si tengo esto:

Dim index As Integer = str.LastIndexOf("") 

... entonces yo debería ser capaz de hacer esto:

Dim substr As String = str.Substring(index, "".Length) 

... y obtener "" espalda. Efectivamente, cuando LastIndexOf devuelve el último índice en la cadena, funciona. Si devolviera la cadena longitud, obtendría un ArgumentOutOfRangeException. Editar: Bueno, parece que estaba equivocado allí. Afortunadamente mi primer punto fue lo suficientemente fuerte por sí mismo;)

0

Hay más información en this question y sus respuestas.

En particular, "Indeed, the empty string logically occurs between every pair of characters."

Cuestiones relacionadas