Почему "abcd" .StartsWith ("") возвращает true? - PullRequest
82 голосов
/ 28 сентября 2008

Заголовок - это весь вопрос. Кто-нибудь может дать мне причину, почему это происходит?

Ответы [ 12 ]

162 голосов
/ 28 сентября 2008

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

Скажем так: какое определение «начинается с» вы могли бы дать, чтобы это исключило? Вот простое определение «начинается с», которого нет:

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

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

"x начинается с y, если x.Substring(0, y.Length).Equals(y)"

46 голосов
/ 11 октября 2008

Я попытаюсь уточнить, что сказал Джон Скит.

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

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

Итак, поскольку ("" + "abcd") == "abcd", отсюда следует, что "abcd" начинается с ""

17 голосов
/ 24 декабря 2008

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

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

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

Теперь исправьте набор B. Я установлю, что пустой набор является подмножеством B. Я сделаю это, показав, что это не тот случай, когда пустой набор не является подмножеством B. Если бы пустой набор не был подмножеством B, я мог бы найти элемент пустого набора, которого нет в B. Но пустой набор не имеет никаких элементов, и поэтому я не могу найти элемент, которого нет в B. Следовательно, это не тот случай, когда пустой набор не является подмножеством B. Таким образом, пустой набор должен быть подмножеством B.

Любая строка начинается с пустой строки.

Во-первых, мы должны согласиться с нашим определением , начинающимся с . Пусть s и t будут string s. Мы говорим, что 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`. Поэтому </p>

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;
}

Вышеупомянутые два полужирных факта являются примерами пусто верных утверждений . Они верны в силу того факта, что определяющие их операторы ( подмножество и начинается с ) являются универсальными количественными определениями над пустыми вселенными. В пустом наборе нет элементов, поэтому в пустом наборе не может быть никаких элементов, кроме как в другом фиксированном наборе. В пустой строке нет символов, поэтому не может быть символа, так как некоторая позиция в пустой строке не соответствует символу в той же позиции в другой фиксированной строке.

17 голосов
/ 28 сентября 2008

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

.NET String.StartsWith

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

Java String.startsWith

11 голосов
/ 16 октября 2008

Скажем так: "abcd".StartsWith("") возвращает false.

если это так, то что означает следующее выражение: true или false:

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

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

7 голосов
/ 28 сентября 2008

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

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

5 голосов
/ 22 июня 2011

Почему «abcd» .StartsWith («») возвращает true?

НАСТОЯЩИЙ ОТВЕТ:

Это должно быть так, иначе у вас был бы случай, когда

    "".startsWith("") == false 
    "".equals("") == true

    but yet

    "a".startsWith("a") == true
    "a".equals("a") == true

и тогда у нас снова будет Y2K, потому что все банковское программное обеспечение, которое зависит от равных условий, начиная с самих себя, перепутает наши счета, и внезапно Билл Гейтс получит мое богатство, и я получу его, и черт его ! Судьба для меня просто не такая.

4 голосов
/ 27 января 2009

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

if (prefix.Length == 0)
{
    return true;
}
4 голосов
/ 28 сентября 2008

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

1 голос
/ 28 сентября 2008

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

...