Когда использовать! () Или! = Если не ноль - PullRequest
20 голосов
/ 05 января 2012

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

if (!(foo == null))

вместо

if (foo != null)

Есть ли какое-либо преимуществооператор?

Есть ли какое-либо преимущество в любом утверждении в c #?

Ответы [ 9 ]

29 голосов
/ 05 января 2012

Я нахожу второй более читабельным.

Кроме этого, нет никакой разницы.

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

10 голосов
/ 05 января 2012

Предполагая, что вы не сломали перегрузки операторов == / !=, я бы просто использовал вторую форму для простоты / читабельности.Если у вас do сломаны перегрузки, так что между ними существует семантическая разница, то я бы предложил исправить эти перегрузки:)

В редком случае, когда foo == null - более четкое указаниечего-то, я бы, вероятно, реорганизовал его для использования локальной переменной:

bool somethingIsMissing = foo == null;
if (!somethingIsMissing)
{
    ...
}

Круглые скобки вокруг foo == null теперь необязательны - используйте или не используйте, по вкусу.Главное, что вы можете использовать имя переменной, чтобы сделать смысловой смысл действительно ясным .

6 голосов
/ 05 января 2012

обычно if (!(foo == null)) используется, когда нужно учесть больше переменных, например

if (!(f1 == 'a' && f2 != 'b'))

иногда просто проще , который преобразует все в противоположность, особенно при использовании побитовых операторов.

5 голосов
/ 05 января 2012

Первый использует два оператора, второй использует один.Технически, второй проще.

3 голосов
/ 05 января 2012

Единственное место, где я бы использовал !(a == b), было бы в реализации оператора != следующим образом:

public static bool operator != (MyType a, MyType b)
{
    return !(a == b);
}
2 голосов
/ 05 января 2012

На мой взгляд, разницы нет, компилятор все равно оптимизирует код. Но я бы предпочел if(foo != null). Меньше скобок и легче для чтения.

1 голос
/ 05 января 2012

Мой предпочтительный - второй, так как он немного более разборчивый, чем первый.

Они не имеют значения, так что это просто вопрос выбора для вас.

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

Ваш выбор в конце.

0 голосов
/ 09 июля 2019

Удобочитаемость является ключевым фактором, поэтому, когда вы используете оператор равенства, вы должны поставить туда! =, Чтобы сделать его более понятным

if ( (a != b) and (a != c) ) яснее, чем if (!( (a == b) or (a == c) )). Однако формат if !() лучше, когда у вас есть функции, которые возвращают логические значения, такие как if !(a.valid()) или if !( String.IsNullOrEmpty(a) )

Также, если ваше выражение равенства становится особенно сложным, что также может ухудшить читабельность, в этот момент лучше переместить тест (ы) в функцию с ясным именем, например if !( this.AllSettingsValid() )

0 голосов
/ 22 декабря 2017

Так как в первой форме используются операторы C # 2 против 1, она может компилироваться в большее количество кода CIL, хотя в большинстве случаев большинство будет сталкиваться, вероятно, она не будет иметь значительный размер кода или разница в производительности.

Что может существенно повлиять на читаемость и, следовательно, вероятность ошибок при записи / изменении. Я бы (и вы, Шелдоны, возможно, захотите закрыть глаза сейчас), избегал бы использования "!" Оператор com-PLETELY. "Задыхайся! Мое ​​- СЛОВО!" Да, я сказал это. И Я ЭТО ЗНАЧУ! Со страстью! Его слишком легко пропустить, так как он часто рядом с похожим символом пунктуации (то есть "(" или "||") слева и похожим на него идентификатором буквы (т.е. "l" или "I") справа И пропустить это может иметь ОСНОВНЫЕ последствия, так как это будет означать, что вы думаете, что код делает ТОЧНОЕ ПРОТИВОПОЛОЖНОЕ из того, что он делает на самом деле! АДА.

Рассмотрим следующий весьма вероятный пример:

   if (!IsIisServerConnected)
   if (IsOfflineMode || !(IsIisLocalServerConnected || IsIisCloudServerConnected))

Я бы вместо этого написал следующее:

   if (false == IsIisServerConnected)

   if 
   (
     IsOfflineMode 
     || 
     (
       false ==
       (
         IsIisLocalServerConnected 
         || IsIisCloudServerConnected
       )
     )
   )

Или в вашем случае:

   if (false == (foo == null))

Помните, что C (язык, от которого C #, C ++, JavaScript, Java и многие другие популярные в настоящее время языки в конечном итоге унаследовали их синтаксис basic ) был создан в то время, когда Punch Cards были все еще распространены. В современных процессорах, оперативной памяти, мониторах и IDE (этот фрагмент «false.Equals (?)» Может быть сгенерирован с помощью пользовательского сочетания клавиш), для большинства людей для большинства приложений удобочитаемость очень, очень, ОЧЕНЬ (я уже говорил) намного "?) важнее, чем сохранение нескольких символов кода.

P.S. Вы также можете добавить метод расширения в Boolean Struct, вызывая его, о, я не знаю, Not! ; D Чтобы ты мог написать:

if (IsIisServerConnected.Not())
if ((foo == null).Not())
...