Строки C # заканчиваются пустой строкой? - PullRequest
18 голосов
/ 10 января 2011

Просто короткий вопрос из любопытства.

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

Ответы [ 4 ]

17 голосов
/ 10 января 2011

EndsWith:

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

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

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

Обновление:

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

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


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

Из MSDN - String Class (System):

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

6 голосов
/ 10 января 2011

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

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

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

2 голосов
/ 10 января 2011

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

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

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

И вот другой способ взглянуть на это: если у меня есть это:

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

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

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

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

0 голосов
/ 10 января 2011

В этом вопросе есть еще информация и ответы на него.

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

...