Мне это не нравится ... Это измена языку? - PullRequest
13 голосов
/ 08 мая 2009

Я видел что-то вроде следующего пару раз ... и я ненавижу это. Это в основном «обманывает» язык? Или ... вы считаете, что это 'нормально', потому что IsNullOrEmpty вычисляется первым, все время?

(Мы могли бы поспорить, должна ли строка быть NULL, когда она выходит из функции, но на самом деле это не вопрос.)

string someString;
someString = MagicFunction();

if (!string.IsNullOrEmpty(someString) && someString.Length > 3)
{
    // normal string, do whatever
}
else
{
   // On a NULL string, it drops to here, because first evaluation of IsNullOrEmpty fails
   // However, the Length function, if used by itself, would throw an exception.
}

EDIT: Еще раз спасибо всем за напоминание об этом фундаментальном языке. Хотя я знал «почему» это сработало, я не могу поверить, что не знал / не помнил название концепции.

(На случай, если кому-то понадобится какой-то фон .. Я столкнулся с этим при устранении неполадок исключений, генерируемых строками NULL и исключениями .Length> x ... в разных местах кода. Поэтому, когда я увидел приведенный выше код, в дополнение все остальное, мое разочарование перешло оттуда.)

Ответы [ 15 ]

0 голосов
/ 08 мая 2009

Написание кода обходится компании очень дорого. Но поддержание этого стоит дороже!

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

Конечно, его попросят исправить критическую ошибку в работе. Он будет искать здесь и там и может не заметить этого.

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

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

Всего наилучшего, Сильвен.

0 голосов
/ 08 мая 2009

Если бы это был код в c, который вы скомпилировали в сборку, это не только короткое замыкание правильного поведения, это быстрее . В машинном языке части оператора if оцениваются одна за другой. Не короткое замыкание медленнее.

0 голосов
/ 08 мая 2009

Я не думаю, что это отличается от этого:

INT* pNumber = GetAddressOfNumber();

if ((pNUmber != NULL) && (*pNumber > 0))
{
  // valid number, do whatever
}
else
{
  // On a null pointer, it drops to here, because (pNumber != NULL) fails
  // However, (*pNumber > 0), if used by itself, would throw and exception when dereferencing NULL
}

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

0 голосов
/ 08 мая 2009

Это имеет смысл, потому что C # по умолчанию замыкает условия, поэтому я думаю, что это хорошо, чтобы использовать это в ваших интересах. В VB могут возникнуть некоторые проблемы, если разработчик использует AND вместо ANDALSO.

0 голосов
/ 08 мая 2009

Я нахожу это нормально :) Вы просто убедитесь, что у вас нет доступа к переменной NULL. На самом деле, я всегда делаю такую ​​проверку перед выполнением какой-либо операции с моей переменной (также при индексации коллекций и т. Д.) - это безопаснее, лучшая практика, вот и все ..

...