Подтвердить что ты не робот

Мне это не нравится... Это обманывает язык?

Я пару раз видел что-то вроде следующего... и я ненавижу это. Это в основном "обманывание" языка? Или... вы считаете, что это "нормально", потому что значение 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 exceptions... в разных местах кода. Поэтому, когда я увидел вышеуказанный код, в дополнение к все остальное, мое разочарование ушло оттуда.)

4b9b3361

Ответ 1

Вы используете функцию языка, известную как короткое замыкание. Это не обманывает язык, а фактически использует функцию, точно такую, как она была предназначена для использования.

Ответ 2

Если вы спрашиваете, зависит ли его ok от операторов отношения "короткого замыкания" && и ||, тогда да, это полностью нормально.

Ответ 3

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

Я думаю, что это разумно сделать.

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

Ответ 4

Этот код является полностью действительным, но мне нравится использовать Null Coalesce Operator для исключения проверок типа null.

string someString = MagicFunction() ?? string.Empty;
if (someString.Length > 3)
{
    // normal string, do whatever
}
else
{
   // NULL strings will be converted to Length = 0 and will end up here.
}

Ответ 5

В этом нет ничего плохого.

if (условия оцениваются слева направо, поэтому он отлично подходит для их укладки таким образом.

Ответ 6

Это допустимый код, на мой взгляд (хотя объявление переменной и назначение ее на следующей строке довольно раздражает), но вы, вероятно, должны понимать, что вы можете ввести else-block также в условии, где длина строка равна < 3.

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

Я бы серьезно пересмотрел найм кого-то, кто не знаком (и не знает, как использовать) операции короткого замыкания.

Ответ 10

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

Ответ 11

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

Ответ 12

Я не думаю, что это не похоже на что-то вроде этого:

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 начал выполнять булевы выражения таким образом (или на каком бы языке он ни был первым).

Ответ 13

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

Ответ 14

Код записи стоил много долларов компании. Но поддерживать это стоит дороже!

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

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

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

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

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

Ответ 15

Отключить тему, но если вы rand тот же пример в vb.net, как этот

dim someString as string
someString = MagicFunction()
if not string.IsNullOrEmpty(someString) and someString.Length > 3 then
    ' normal string, do whatever
else
    ' do someting else
end if

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

dim someString as string
someString = MagicFunction()
if not string.IsNullOrEmpty(someString) andalso someString.Length > 3 then
    ' normal string, do whatever
else
    ' do someting else
end if

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

Drux