Название - это весь вопрос. Может ли кто-нибудь объяснить мне причину, почему это происходит?
Почему "abcd".StartsWith("") возвращает true?
Ответ 1
Да - потому что он начинается с пустой строки. Действительно, пустая строка логически встречается между каждой парой символов.
Положите это так: какое определение "начинается с" вы могли бы дать, что бы это исключало? Здесь простое определение "начинается с", а не:
"x начинается с y, если первые y.Length
символы х совпадают с символами y."
Альтернативное (эквивалентное) определение:
"x начинается с y, если x.Substring(0, y.Length).Equals(y)
"
Ответ 2
Я попытаюсь рассказать о том, что сказал Джон Скит.
Пусть говорят, что x, y и z - строки, а + оператор на самом деле является конкатенацией, то:
Если мы можем разбить z на z = x + y, это означает, что z начинается с x. Поскольку каждая строка z может быть разделена на z = "+ z, то каждая строка начинается с" ".
Итак, потому что ( "+" abcd ") ==" abcd "следует, что" abcd "начинается с" "
Ответ 3
Этот метод сравнивает параметр значения с подстрокой в начале этой строки, которая равна той же длине, что и значение, и возвращает значение, указывающее, являются ли они равными. Чтобы быть равным, значение должно быть пустой строкой (пустой), ссылкой на этот же экземпляр или соответствовать началу этого экземпляра.
true, если последовательность символов, представленная аргументом, является префиксом последовательности символов, представленной этой строкой; false в противном случае. Обратите внимание, что true будет возвращен true, если аргумент представляет собой пустую строку или равен этому объекту String, как определено методом equals (Object).
Ответ 4
Я начну с связанного с этим факта, который легче понять.
Пустое множество - это подмножество каждого множества.
Почему? определение состояний подмножества, что A
является подмножеством B
, если каждый элемент A
является элементом B
. И наоборот, A
не является подмножеством B
, если есть элемент A
, который не является элементом B
.
Теперь исправьте набор B
. Я установил, что пустой набор является подмножеством B
. Я сделаю это, показывая, что это не тот случай, когда пустой набор не является подмножеством B
. Если пустой набор не был подмножеством B
, то я мог бы найти элемент пустого набора, который не находится в B
. Но пустое множество не имеет никаких элементов, и поэтому я не могу найти элемент, который не находится в B
. Поэтому не пустое множество не является подмножеством B
. Таким образом, пустое множество должно быть подмножеством B
.
Любая строка начинается с пустой строки.
Во-первых, мы должны договориться о нашем определении начала с. Пусть s
и t
be string
Мы говорим, что s
начинается с t
, если s.Length >= t.Length
, а первые t.Length
символы t
совпадают с символами s
. То есть s.Length >= t.Length
и для каждого Int32 index
такого, что 0 <= index < t.Length
, s[index] == t[index]
истинно. Наоборот, мы бы сказали, что s
не начинается с t
, если утверждение
s.Length < t.Length
или s.Length >= t.Length
, и существует Int32 index
такое, что 0 <= index < t.Length
и s[index] != t[index]
истинно. На простом английском языке s
короче t
, или, если нет, в t
символ не совпадает с символом в той же позиции в s
.
Теперь исправьте строку s
. Я установил, что s
начинается с пустой строки. Я сделаю это, показывая, что это не тот случай, когда s
не начинается с пустой строки. Если s
не начинается с пустой строки, то s.Length < String.Empty.Length
или s.Length >= String.Empty.Length
и существует Int32 index
, для которого 0 <= index < String.Empty.Length
. Но s.Length >= 0
и String.Empty.Length
равно нулю, поэтому для s.Length < String.Empty.Length
невозможно быть истинным. Аналогично, поскольку `` String.Empty.Length is equal to zero, there is no
Int32 index satisfying
0 <= index < String.Empty.Length`. Поэтому
s.Length < String.Empty.Length
или s.Length >= String.Empty.Length
, и существует Int32 index
такое, что 0 <= index < String.Empty.Length
является ложным. Следовательно, это не так, что s
не начинается с пустой строки. Таким образом, s
должен начинаться с пустой строки.
Ниже приведена реализация запусков с кодировкой как расширение до string
.
public static bool DoStartsWith(this string s, string t) {
if (s.Length >= t.Length) {
for (int index = 0; index < t.Length; index++) {
if (s[index] != t[index]) {
return false;
}
}
return true;
}
return false;
}
Вышеуказанные два смелых факта являются примерами неопределенных истинностных утверждений. Они верны в силу того факта, что утверждения, определяющие их (подмножество и начинается с), являются универсальными квантификациями по пустым вселенным. В пустом наборе нет элементов, поэтому не может быть никаких элементов пустого набора, не в каком-либо другом фиксированном множестве. В пустой строке нет символов, поэтому не может быть символ как некоторая позиция в пустой строке, не соответствующая символу в той же позиции в некоторой другой фиксированной строке.
Ответ 5
Скажем, "abcd".StartsWith("")
возвращает false.
если да, то что означает следующее выражение eval, true или false:
("abcd".Substring(0,0) == "")
получается, что evals соответствует true, поэтому строка начинается с пустой строки;-) или, другими словами, подстрока "abcd", начинающаяся с позиции 0 и имеющая длину 0, равна пустой строке "", Довольно логично.
Ответ 6
В С# это означает, что спецификация реагирует;
Чтобы быть равным, значение должно быть пустой строкой (пустой), ссылкой на этот же экземпляр или соответствовать началу этого экземпляра.
Ответ 7
Почему "abcd".StartsWith("") возвращает true?
РЕАЛЬНЫЙ ОТВЕТ:
Это должно быть так, иначе у вас будет случай, когда
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
и тогда у нас будет Y2K снова, потому что все банковское программное обеспечение, которое зависит от равных строк, начинающихся с самих себя, заставит наши счета перепутаться, и вдруг у Билла Гейтса будет мое богатство, и у меня будет его, и черт возьми! Судьба просто для меня не такая.
Ответ 8
Первые N символов двух строк идентичны. N - длина второй строки, то есть нуль.
Ответ 9
Только для записи String.StartsWith()
внутренне вызывает метод System.Globalization.CultureInfo.IsPrefix()
, который явно выполняет следующую проверку:
if (prefix.Length == 0)
{
return true;
}
Ответ 10
Поскольку строка начинается с "ничего".
Ответ 11
Если вы думаете об этом в терминах регулярных выражений, это имеет смысл. Каждая строка (а не только "abcd", также "и" sdf\nff") возвращает true при оценке регулярного выражения "начинается с пустой строки".
Ответ 12
В С# причина, по которой он возвращает true
, заключается в том, что разработчики специально закодированы для него.
Если вы посмотрите исходный код, вы найдете определенную логику для обработки пустой строки:
public Boolean StartsWith(String value)
{
return StartsWith(value, StringComparison.CurrentCulture);
}
public Boolean StartsWith(String value, StringComparison comparisonType)
{
...
if (value.Length == 0)
{
return true;
}