Строки С# заканчиваются пустой строкой?
Просто короткий вопрос из любопытства.
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 :)
Ответы
Ответ 1
EndsWith
:
Определяет, соответствует ли конец этого экземпляра строки указанной строке.
Все строки будут соответствовать ""
в конце... или любой другой части строки. Зачем? Поскольку концептуально существуют пустые строки вокруг каждого символа.
"" + "abc" + "" == "abc" == "" + "a" + "" + "b" + "" + "c" + ""
Update:
О вашем последнем примере - это описано на LastIndexOf
:
Если значением является String.Empty, возвращаемое значение является последней позицией индекса в этом экземпляре.
Связанная с этим проблема - использование значения null в качестве ограничителя строк, которое происходит на C и С++, но не на С#.
Из MSDN - String Class (System)
:
В .NET Framework объект String может содержать внедренные нулевые символы, которые считаются частью длины строки. Однако на некоторых языках, таких как C и С++, нулевой символ указывает конец строки; он не считается частью строки и не считается частью длины строки.
Ответ 2
Попробуйте следующее:
string str = "string";
Console.WriteLine(str.EndsWith(string.Empty)); //true
Console.WriteLine(str.LastIndexOf(string.Empty) == str.Length-1); // true
Console.ReadLine();
Итак, да, как сказал Одед, они всегда совпадают.
Ответ 3
Подумайте об этом следующим образом: LastIndexOf
является бессмысленным с пустой строкой. Можно сказать, что пустая строка существует в каждом индексе внутри строки, между каждым символом. Таким образом, документация дает окончательный ответ на то, что должно быть возвращено:
Если значение String.Empty, возврат значение - это последняя позиция индекса в этот экземпляр.
По крайней мере, в этом случае он возвращает фактический индекс. Если он вернул длину строки (представляя индекс "после" конца, который, по моему мнению, был вашей точкой), он будет возвращать результат для метода с именем LastIndexOf
, который даже не является индексом.
И вот еще один способ взглянуть на это: если у меня есть это:
Dim index As Integer = str.LastIndexOf("")
... тогда я должен был бы это сделать:
Dim substr As String = str.Substring(index, "".Length)
... и получите ""
назад. Разумеется, когда LastIndexOf
возвращает последний индекс в строке, он работает. Если он вернет длину строки, я бы получил ArgumentOutOfRangeException
. Изменить. Ну, похоже, я был не там. Надеюсь, мой первый пункт был достаточно силен сам по себе;)
Ответ 4
Вот еще информация в этом вопросе и его ответы.
В частности, "Indeed, the empty string logically occurs between every pair of characters."