Почему струна?IsNullOrWhiteSpace ("") - ложь



Я столкнулся с проблемой, где невидимый символ , который довольно похож на "пробел", не рассматривается как пробел строкой.Метод IsNullOrWhiteSpace. Интересно, почему это реализовано в .NET таким образом и есть ли альтернатива string.IsNullOrWhiteSpace, который может правильно обрабатывать символ null-terminate?
Заранее спасибо.

665   6  

6 ответов:

U+0000 в принципе не является пробелом. char.IsWhitespace('\0') возвращает false, он не указан как пробел...

Частьnull IsNullOrWhitespace ссылается на саму ссылку на строку, а не на ее содержимое, если вы об этом подумали.

Обратите внимание, что строки в .NET не являются логически "завершенными нулем" в управляемом коде, хотя на практике на уровне CLR они являются таковыми для целей взаимодействия. (Строка знает свою длину, но для того, чтобы было проще работать с машинным кодом который делает ожидаемым нулевым Терминатором, CLR гарантирует, что всегда есть U+0000 после содержимого строки.) Если вы в конечном итоге получаете строку, содержащую \0, вы, вероятно, должны исправить то, что произвело его для начала.

Можно заменить все символы \0 пробелом, а затем проверить наличие пробела.

string.IsNullOrWhiteSpace("\0".Replace('\0', ' ');

По забавным историческим причинам (они, конечно, забавны, но я не смог их найти), null имеет два значения... null указатель / ссылка (называемый NULL В C), и NUL (или NULL) \0 характер.

String.IsNullOrWhiteSpace делает:

Указывает, является ли указанная строка нулевой, пустой или состоит только из пробелов.

С null, означающим "null Ссылка", пустой означает пустой и Пробел означает

Пробельные символы, определенные стандартом Unicode. Метод IsNullOrWhiteSpace интерпретирует любой символ, возвращающий значение true, когда он передается в метод Char.IsWhiteSpace, как символ пробела.

Список символов, которые Char.IsWhiteSpace считает, что пробел присутствует на странице Char.IsWhiteSpace.

Символ'\0 ' не считается пробелом. Видишь Char.IsWhitespace() для списка символов, которые считаются пробелами.

Использование Enumerable.All() Если у вас есть свои собственные требования, или даже просто добавить несколько символов своих собственных. Что-то вроде этого:

bool IsMyKindOfWhiteSpace(string input)
{
    char[] more = new char[] { <here goes your list of additional white space chars> };

    return input.All(x => Char.IsWhiteSpace(x) || more.Contains(x));
}

Пустая строка-это не то же самое, что пустая строка или пробел

Создайте метод расширения, который добавляет нулевой символ it в качестве проверки.

public bool IsNullOrWhitespaceOrHasNullChar(this string text)
{
   return string.IsNullOrWhiteSpace(text) || Regex.IsMatch(text, "\0");
}

Обратите внимание, что нулевой символ существует в любом месте строки, он будет найден и сообщен как таковой, поэтому строка с "a\0" вернет true. Если это вызывает беспокойство, создайте тест, который проверяет наличие полной строки \0.

Comments

    Ничего не найдено.