Да - потому что это действительно начинается с пустой строки. Действительно, пустая строка логически происходит между каждой парой символов.
Помещенный это этот путь: то, что определение "запускает с" Вас, могло дать, который устранил бы это? Вот простое определение, "запускается с", который не делает:
"x запускается с y, если первые y.Length
символы x соответствуют тем y".
альтернативное (эквивалентное) определение:
"x запускается с y если x.Substring(0, y.Length).Equals(y)
"
Я попытаюсь уточнить то, что сказал Jon Skeet.
Скажем, x, y и z являются строками и +, оператор является на самом деле конкатенацией, тогда:
, Если мы можем разделить z для записи z = x + y, который означает, что z запускается с x. Поскольку каждая строка z может быть разделена к z = ""+ z из этого следует, что каждая строка запускается с "".
Так, потому что ("" + "abcd") == "abcd" из этого следует, что "abcd" запускается с""
Этот метод сравнивает параметр, передаваемый по значению с подстрокой в начале этой строки, которая является той же длиной как значение и возвращает значение, которое указывает, равны ли они. , Чтобы быть равным, значение должно быть (Пустой) пустой строкой, ссылка на этот тот же экземпляр, или соответствовать началу этого экземпляра.
, верный, если последовательность символов, представленная аргументом, является префиксом последовательности символов, представленной этой строкой; ложь иначе. Примечание также, что верный будет возвращен, если аргумент будет пустой строкой или будет равен этому Строковому объекту, как определено, равняется (Объектному) методу.
Позвольте нам просто сказать "abcd".StartsWith("")
, возвращает false.
раз так тогда, что делает следующую оценку выражения к, TRUE или FALSE:
("abcd".Substring(0,0) == "")
оказывается, что evals к истинному, таким образом, строка действительно запускается с пустой строки;-), или помещенный, другими словами, подстрока "abcd", запускающегося в положении 0 и имеющего 0 длин, равняется пустой строке "". Довольно логический imo.
Я запущу со связанного факта, который легче понять.
пустое множество является подмножеством каждого набора.
, Почему? определение подмножество состояния, который A
является подмножеством B
, если каждый элемент A
является элементом B
. С другой стороны, A
не подмножество B
, если существует элемент A
, который не является элементом B
.
Теперь фиксируют набор B
. Я установлю, что пустое множество является подмножеством [1 110]. Я сделаю это путем показа этого не то, что пустое множество не является подмножеством [1 111]. Если бы пустое множество не было подмножеством [1 112] тогда, то я мог бы найти элемент пустого множества, которое не находится в [1 113]. Но пустое множество не имеет никаких элементов, и таким образом я не могу найти элемент, который не находится в [1 114]. Поэтому не то, что пустое множество не является подмножеством [1 115]. Таким образом пустое множество должно быть подмножеством [1 116].
Любая строка запускается с пустой строки.
Первый, мы должны договориться о нашем определении , запускается с [1 165]. Позвольте s
и t
быть string
с, Мы говорим, что s
запускается с [1 166] t
если s.Length >= t.Length
и первое t.Length
символы [1 124] те соответствия s
. Таким образом, s.Length >= t.Length
и для каждого Int32 index
таким образом, что 0 <= index < t.Length
, s[index] == t[index]
верно. С другой стороны мы сказали бы, что s
не запускается с [1 131] если оператор
s.Length < t.Length
или s.Length >= t.Length
и существует Int32 index
таким образом, что 0 <= index < t.Length
и s[index] != t[index]
верно. Без обиняков, s
короче, чем [1 138], или, в противном случае существует символ в [1 139] не соответствие символу как то же положение в [1 140].
Теперь чинят строку 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
равно для обнуления так, для [1 151] невозможно быть верным. Точно так же начиная с ''Строка. Пустой. Длина is equal to zero, there is no
индекс satisfying
0 Int32 < = индексируйте < Строка. Пустой. Длина'. Поэтому
s.Length < String.Empty.Length
или s.Length >= String.Empty.Length
и существует Int32 index
таким образом, что 0 <= index < String.Empty.Length
ложь. Поэтому не то, что s
не запускается с пустой строки. Таким образом, s
должен запуститься с пустой строки.
следующее является реализацией [1 167], запускается с [1 167] кодированный как расширение [1 160].
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;
}
вышеупомянутые два полужирных факта являются примерами [1 162] вырождено истинные операторы . Они верны на основании того, что операторы, определяющие их ( подмножество и запускается с [1 169]), универсальные определения количества по пустым вселенным. В пустом множестве нет никаких элементов, таким образом, не может быть никаких элементов пустого множества не в некотором другом фиксированном наборе. Нет никаких символов в пустой строке, таким образом, не может быть символа как некоторое положение в пустой строке, не соответствующей символу в том же положении в некоторой другой фиксированной строке.
Первые символы N двух строк идентичны. N быть длиной второй строки, т.е. нулем.
В C# это - то, как спецификация говорит ему реагировать;
, Чтобы быть равным, значение должно быть (Пустой) пустой строкой, ссылка на этот тот же экземпляр, или соответствовать началу этого экземпляра.
Поскольку строка ни с "чего" не начинается хорошо.
Только для справки, String.StartsWith()
внутренне вызовы метод System.Globalization.CultureInfo.IsPrefix()
, который осуществляет следующую проверку явно:
if (prefix.Length == 0)
{
return true;
}
При размышлении о нем в терминах регулярных выражений это имеет смысл. Каждая строка (не только "abcd", также "" и "sdf\nff"), возвращает true при оценке регулярного выражения, 'запускается с пустой строки'.