Строка C#. IsNullOrEmpty: хороший или плохой?

Вы могли сделать, чтобы они были в определенной яркости. это управляло бы количеством "неоновых" цветов немного. например, если бы "яркость"

brightness = sqrt(R^2+G^2+B^2)

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

15
задан batintherain 27 November 2017 в 11:56
поделиться

10 ответов

Эта проблема устранена в .NET 2.0 с пакетом обновления 1 (SP1). Нет причин избегать его использования сейчас.

Если вы используете .NET 2, в любом случае у вас должен быть sp1 по многим другим причинам - я не вижу причин избегать этого из-за ошибки, которой больше не существует.

24
ответ дан 1 December 2019 в 01:11
поделиться

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

Если метод делает именно то, что вы хотите, вы должны использовать его. Однако вы не должны использовать его в каждой ситуации для проверки пустой строки. Иногда вам нужно только проверить, пуста ли строка, а не нулевая.

Если строковая переменная имеет значение NULL, это просто пропустит блок кода:

 if (!String.IsNullOrEmpty(str)) { ... }

Если строковая переменная имеет значение NULL, это вызовет исключение:

 if (str.Length > 0) { ... }

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

5
ответ дан 1 December 2019 в 01:11
поделиться

В том отчете об ошибке в ссылке, которую вы включаете, говорится:

Эта ошибка была исправлена ​​в Microsoft .NET Framework 2.0 с пакетом обновления 1 (SP1).

В этом случае не имеет значения, используете ли вы VS 2005, если у вас установлен SP1 для .NET 2.

Что касается того, использовать ли его, ознакомьтесь с этим сообщением от CodingHorror .

3
ответ дан 1 December 2019 в 01:11
поделиться

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

4
ответ дан 1 December 2019 в 01:11
поделиться

Мы используем метод расширения для string.IsNullOrEmpty :

public static bool IsNullOrEmpty(this string target)
{
  return string.IsNullOrEmpty(target);
}

Используя этот подход, даже если он был сломан в какой-то предыдущей версии, исправление ошибки составляет только одну строку код.

И дополнительная утилита, позволяющая использовать метод для экземпляра строки, которая может иметь значение NULL:

string myString = null;
if (myString.IsNullOrEmpty())
{
  // Still works
}
3
ответ дан 1 December 2019 в 01:11
поделиться

Я почти уверен, что это было исправлено в SP1, но в любом случае вы можете создать свой собственный нулевой или пустой метод :)

1
ответ дан 1 December 2019 в 01:11
поделиться

Как и в случае с любым языком или его частью, все дело в знании плюсов и минусов и принятии обоснованного решения на основе этой информации. ИМХО.

1
ответ дан 1 December 2019 в 01:11
поделиться

Если он не работает в вашей версии, то просто иметь статический метод, который будет выполнять проверку, - тривиально, так что просто сделайте:

public static bool isNull(String s) {
  return s == null || s.trim().length == 0;
}

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

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

0
ответ дан 1 December 2019 в 01:11
поделиться

Не прямой ответ, но я бы использовал тип Oracle TIMESTAMP:

  • TIMESTAMP (точность fractional_seconds_) Значения года, месяца и дня даты, а также часа, минуты и вторые значения времени, где дробная _ секунд _ точность дополнительно указывает количество цифры в дробной части SECOND поле datetime и может быть число в диапазоне от 0 до 9. по умолчанию - 6. Например, указывается TIMESTAMP в виде литерала:

     TIMESTAMP '1997-01-31 09:26: 50,124'
    

с требуемой дробной _ второй _ точностью .

-121--3113850-

Попробуйте удалить файлы ASO.

Файлы ASO кэшируются скомпилированные версии файлов классов. Хотя среда IDE намного лучше позволяет удалять старые кэш-памяти при внесении изменений, иногда их приходится удалять вручную. Удаление файлов ASO: Управление > Удаление файлов ASO.

Это также является причиной ошибки «I-am-not-sewing-my-changes-so-let-me-add-a-trace-now-everything-works», которая была представлена в CS3.

-121--2003304-

Интересно, почему люди используют струнные. Пустая, это не очень хорошо, потому что это инициализированная последовательность и это понятие существует только в .Net фрейме везде, где это допустимая последовательность с len 0 (серверы БД дают очень четкое распределение между этим и будут жаловаться, если у вас есть логика проверки на NULL, но вы получаете и пустой последовательности). Я думаю, эта последовательность. IsStartOrEmpty является одним из 5 худших практик/функций, которые я когда-либо видел, потому что каким-то образом он поощряет/делает его хорошим человеком для инициализации своих последовательностей и может рассматриваться как null. Эта функция никогда не должна была быть добавлена, и я думаю, что ребята .Net должны попытаться поэтапно отказаться от нее:) Кому нужна и пустая последовательность в любом случае? Я никогда не использовал его, если мне не пришлось его использовать из-за существующих проектов

-5
ответ дан 1 December 2019 в 01:11
поделиться

При реализации проверки аргументов в API я, как правило, проверяю каждое условие в отдельности и бросаю различные исключения: ArgumentNullException для нулевой ссылки или, в зависимости от спецификации API, ArgumentException для пустой строки. В этом случае использование String.IsNullOrEmpty не позволяет отличить эти два отдельных условия ошибки.

if (str == null)
{
    throw new ArgumentNullException("str");
}
if (str == string.Empty)
{
    throw new ArgumentException("The string cannot be empty.", "str");
}
2
ответ дан 1 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

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