Подтвердить что ты не робот

Строки С# заканчиваются пустой строкой?

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

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

Ответ 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."