Почему делает "abcd".StartsWith (“”), возвращают true?

83
задан Charles Stewart 7 February 2011 в 07:07
поделиться

10 ответов

Да - потому что это действительно начинается с пустой строки. Действительно, пустая строка логически происходит между каждой парой символов.

Помещенный это этот путь: то, что определение "запускает с" Вас, могло дать, который устранил бы это? Вот простое определение, "запускается с", который не делает:

"x запускается с y, если первые y.Length символы x соответствуют тем y".

альтернативное (эквивалентное) определение:

"x запускается с y если x.Substring(0, y.Length).Equals(y)"

163
ответ дан Soner Gönül 24 November 2019 в 08:41
поделиться

Я попытаюсь уточнить то, что сказал Jon Skeet.

Скажем, x, y и z являются строками и +, оператор является на самом деле конкатенацией, тогда:

, Если мы можем разделить z для записи z = x + y, который означает, что z запускается с x. Поскольку каждая строка z может быть разделена к z = ""+ z из этого следует, что каждая строка запускается с "".

Так, потому что ("" + "abcd") == "abcd" из этого следует, что "abcd" запускается с""

46
ответ дан Petar Repac 24 November 2019 в 08:41
поделиться

Этот метод сравнивает параметр, передаваемый по значению с подстрокой в начале этой строки, которая является той же длиной как значение и возвращает значение, которое указывает, равны ли они. , Чтобы быть равным, значение должно быть (Пустой) пустой строкой, ссылка на этот тот же экземпляр, или соответствовать началу этого экземпляра.

Строка.NET. StartsWith

, верный, если последовательность символов, представленная аргументом, является префиксом последовательности символов, представленной этой строкой; ложь иначе. Примечание также, что верный будет возвращен, если аргумент будет пустой строкой или будет равен этому Строковому объекту, как определено, равняется (Объектному) методу.

Java String.startsWith

17
ответ дан Firas Assaad 24 November 2019 в 08:41
поделиться

Позвольте нам просто сказать "abcd".StartsWith(""), возвращает false.

раз так тогда, что делает следующую оценку выражения к, TRUE или FALSE:

 ("abcd".Substring(0,0) == "")

оказывается, что evals к истинному, таким образом, строка действительно запускается с пустой строки;-), или помещенный, другими словами, подстрока "abcd", запускающегося в положении 0 и имеющего 0 длин, равняется пустой строке "". Довольно логический imo.

11
ответ дан CSchulz 24 November 2019 в 08:41
поделиться

Я запущу со связанного факта, который легче понять.

пустое множество является подмножеством каждого набора.

, Почему? определение подмножество состояния, который 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]), универсальные определения количества по пустым вселенным. В пустом множестве нет никаких элементов, таким образом, не может быть никаких элементов пустого множества не в некотором другом фиксированном наборе. Нет никаких символов в пустой строке, таким образом, не может быть символа как некоторое положение в пустой строке, не соответствующей символу в том же положении в некоторой другой фиксированной строке.

17
ответ дан jason 24 November 2019 в 08:41
поделиться

Первые символы N двух строк идентичны. N быть длиной второй строки, т.е. нулем.

4
ответ дан Ralph 24 November 2019 в 08:41
поделиться

В C# это - то, как спецификация говорит ему реагировать;

, Чтобы быть равным, значение должно быть (Пустой) пустой строкой, ссылка на этот тот же экземпляр, или соответствовать началу этого экземпляра.

7
ответ дан blowdart 24 November 2019 в 08:41
поделиться

Поскольку строка ни с "чего" не начинается хорошо.

1
ответ дан gizmo 24 November 2019 в 08:41
поделиться

Только для справки, String.StartsWith() внутренне вызовы метод System.Globalization.CultureInfo.IsPrefix(), который осуществляет следующую проверку явно:

if (prefix.Length == 0)
{
    return true;
}
4
ответ дан CSchulz 24 November 2019 в 08:41
поделиться

При размышлении о нем в терминах регулярных выражений это имеет смысл. Каждая строка (не только "abcd", также "" и "sdf\nff"), возвращает true при оценке регулярного выражения, 'запускается с пустой строки'.

1
ответ дан 24 November 2019 в 08:41
поделиться