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

Когда использовать!() Или!= Если если не null

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

if (!(foo == null))

вместо

if (foo != null)

Есть ли какое-либо преимущество в любом из выражений?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

public static bool operator != (MyType a, MyType b)
{
    return !(a == b);
}

Ответ 6

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

Ответ 7

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

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

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

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

Ответ 8

Так как в первой форме используются операторы С# 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++, JavaScript, Java и многие другие популярные в настоящее время языки в конечном итоге унаследовали свой основной синтаксис) был создан в то время, когда перфокарты были все еще распространены. В современных процессорах, оперативной памяти, мониторах и IDE (этот фрагмент "false.Equals(?)" Может быть сгенерирован с помощью специального сочетания клавиш), для большинства людей для большинства приложений удобочитаемость очень, очень, ОЧЕНЬ (я уже говорил) намного "?) важнее, чем сохранение нескольких символов кода.

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

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

Ответ 9

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

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

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