2011-01-10 5 views
18

Просто короткий вопрос из любопытства.Ли строки C# заканчиваются пустой строкой?

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

Какова ваша концепция 'string.Empty'? Что это? – thecoop

+7

Все не содержит ничего. Ничто не повсюду. – BoltClock

+0

Вопрос в том, почему так много голосов за такой бессмысленный вопрос? Почему именно имеет значение, что известно, что строка C# выполняет или не заканчивается пустой строкой? Как именно вы использовали бы такую ​​ценную информацию? – Blake7

ответ

17

EndsWith:

Определяет, совпадает ли конец данного экземпляра строки заданную строку.

Все строки будут соответствовать "" в конце ... или любой другой части строки. Зачем? Потому что концептуально существуют пустые строки вокруг каждого символа.

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

Update:

О вашем последнем примере - это документировано на LastIndexOf:

Если значение String.Empty, возвращаемое значение является последним индексом в этом пример.


Смежный вопрос является использование нуля в виде строки терминатора - что происходит в C и C++, но не C#.

Из MSDN - String Class (System):

В .NET Framework, объект Строка может включать в себя встроенные нулевые символы, которые просчитывают как часть длины струны. Однако на некоторых языках, таких как C и C++, нулевой символ указывает конец строки; он не считается частью строки и не считается частью длины строки.

6

Попробуйте это:

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

Так что да, как сказал Одед, они всегда совпадают.

+0

ooh Хороший плюс один за критический сайт на Q? code snippet – Badr

+0

Я не думаю, что код OP 'str.LastIndexOf (string.Empty) == str.Length' является ошибкой, поскольку OP думает, что' string.Empty' - это что-то после ** g ** – Bolu

+1

Конечно, строки используют индексирование на основе 0, я просто написал это для удовольствия, чтобы проверить, не потеряет ли пустая строка какой-то дополнительный индекс каким-то образом чудом :) – nan

2

Подумайте об этом так: LastIndexOf - это бессмысленно с пустой строкой. Можно сказать, что пустая строка существует на каждый индекс внутри строки, между каждым символом. documentation, таким образом, дает однозначный ответ на то, что должно быть возвращено:

Если значение String.Empty, возвращаемое значение является последним индексом в этого экземпляра.

По крайней мере, в этом случае он возвращает действительный индекс. Если он вернул длину строки (представляя индекс «после» конца, который, по моему мнению, был вашей точкой), он будет возвращать результат для метода с именем LastIndexOf, который даже не является индексом.

А вот еще один способ смотреть на него: Если у меня есть это:

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

... то я должен быть в состоянии сделать это:

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

... и получить "" назад. Конечно, когда LastIndexOf возвращает последний индекс в строке, он работает. Если он вернул строку длиной, я бы получил ArgumentOutOfRangeException. Редактировать: Ну, похоже, я был не там. Надеюсь, мой первый пункт был достаточно сильным сам по себе;)

0

Есть еще одна информация в this question и ее ответы.

В частности, "Indeed, the empty string logically occurs between every pair of characters."

Смежные вопросы