строка. Пустой. StartsWith (((символ) 10781).ToString ()) всегда возвращает true?

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

поля Static там (a) потому что они были там в JDK 1.0, и много изворотливых решений были приняты в JDK 1.0 и (b) статическими заключительными полями в интерфейсах, самая близкая вещь, которую Java имел к константам в то время.

Статические внутренние классы в интерфейсах были позволены, потому что это - чистый синтаксический сахар - внутренний класс - на самом деле ничто, чтобы сделать с родительским классом.

, Таким образом, статические методы не позволяются просто, потому что нет никакого неопровержимого довода, чтобы сделать так; непротиворечивость не достаточно востребована для изменения статус-кво.

, Конечно, это могло быть разрешено в будущих версиях JLS, ничего не повреждая.

6
задан DxCK 12 December 2009 в 11:38
поделиться

3 ответа

Вы можете исправить эту ошибку, используя порядковый номер StringComparison :

Из документации MSDN:

Если вы укажете либо StringComparison.Ordinal или StringComparison.OrdinalIgnoreCase, сравнение строк будет неязыковые. То есть особенности которые характерны для естественных язык игнорируется при создании решения для сравнения. Это означает решения основаны на простых байтах сравнения и игнорировать регистр или таблицы эквивалентности, которые параметризованный культурой. Как результат, путем явной установки параметра на либо StringComparison.Ordinal, либо StringComparison.OrdinalIgnoreCase, ваш код часто набирает скорость, увеличивается правильность, и становится больше надежный.

    char specialChar = (char)10781;


    string specialString = Convert.ToString(specialChar);

    // prints 1
    Console.WriteLine(specialString.Length);

    // prints 10781
    Console.WriteLine((int)specialChar);

    // prints false
    Console.WriteLine(string.Empty.StartsWith("A"));

    // prints false
    Console.WriteLine(string.Empty.StartsWith(specialString, StringComparison.Ordinal));
11
ответ дан 8 December 2019 в 12:20
поделиться

Основная причина этого - сравнение строк по умолчанию с учетом локали. Это означает использование таблиц данных локали для сравнений (включая равенство).

Многие (если не большинство) символы Unicode не имеют значения для многих локалей и, следовательно, не существуют (или существуют, но соответствуют чему-либо, или ничего).

См. Записи о весе символов в блоге Майкла Каплана « Sorting It All Out ». Эта серия блогов содержит много справочной информации (API-интерфейсы являются собственными, но, как я понимаю, механизмы в .NET такие же).

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

4
ответ дан 8 December 2019 в 12:20
поделиться

Хороший глюк юникода ;-p

Я не уверен, почему он это делает, но забавно:

Console.WriteLine(string.Empty.StartsWith(specialString)); // true
Console.WriteLine(string.Empty.Contains(specialString)); // false
Console.WriteLine("abc".StartsWith(specialString)); // true
Console.WriteLine("abc".Contains(specialString)); // false

Я предполагаю, что это немного похоже на несоединяющийся символ что Джон упомянул на devdays ; некоторые строковые функции его видят, а некоторые нет. А если он этого не видит, это становится «начинается ли (некоторая строка) с пустой строки», что всегда истинно.

4
ответ дан 8 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: