Мне это не нравится ... Это измена языку? - 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 ]

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

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

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

Если вы спрашиваете, можно ли полагаться на реляционные операторы «1001» и «1002» «короткого замыкания», тогда да, это нормально.

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

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

Я думаю, что это разумно.

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

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

Этот код полностью действителен, но мне нравится использовать оператор Null Coalesce для избежания проверок нулевых типов.

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.
}
4 голосов
/ 08 мая 2009

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

if (условия оцениваются слева направо, так что это прекрасно, если сложить их так.

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

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

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

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

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

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

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

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

1 голос
/ 08 мая 2009

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

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

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

Немного не по теме, но если вы используете тот же пример на 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 вы кодируете его следующим образом, делайте то же самое в C #

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 one показывает, что логин немного отличается, и поэтому ему легче объяснить кому-то, что есть различия и т. д.

Drux

...