2012-01-05 5 views
17

Хотя рефакторинга кода я изменил все, если не нулевые условия следовать большинства конвенции в моем кодеКогда использовать!() Или! = Когда, если не нулевой

if (!(foo == null)) 

вместо

if (foo != null) 

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

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

+0

Спасибо всем, может рефакторинг снова: -/ –

ответ

26

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

Помимо этого, нет разницы.

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

+8

Гораздо более читаемым. –

+0

И, кроме того, когда вы читаете код в первом сценарии, вы можете видеть действия (равные и не), а во втором - «чтение дружественных», и вы воспринимаете как одно действие. – Samich

+0

@Oded: Согласен «второй (* слегка *) более читабельный» относительно первого, но это, ИМХО, ПУТЬ слишком нечитабельно в свете причин в и относительно альтернативного предложения в моем ответе от 12/21/17 ниже. Кроме того, часто «соглашения», которые, возможно, были совершенно прекрасны на основе знаний и ситуаций в то время, совершенно неадекватны в свете новых знаний и/или ситуаций. – Tom

10

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

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

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

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

+0

ИМХО, все еще ПУТЬ тоже нечитабельно в свете причин в и относительно альтернативного предложения в моем ответе от 12/21/17 ниже. – Tom

+0

@Tom: Думаю, нам придется согласиться не согласиться. Я бы предпочел использовать общий, идиоматический подход, который не удивит разработчиков. –

2

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

5

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

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

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

+5

Я бы, вероятно, использовал 'if (f1! = 'A' || f2 == 'b')', чтобы быть более четким в этом случае. –

+0

сложно, если у вас большая цепочка и специально с флагами: -/это более «читаемо», как 'if (! (E.Row.RowType == DataControlRowType.DataRow && (e.Row.RowState & DataControlRowState.Edit) = = DataControlRowState.Edit)) 'no?например 'if is not DataRow или Edit type ...' – balexandre

+0

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

5

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

+0

, но рекомендуемая реализация оператора ' ! = 'is' return! (a == b) '. Так что это происходит под капотом. – Oliver

+1

Это как сказать, что мотоцикл легче ездить, чем автомобиль, потому что у него меньше колес. – Sjoerd

1

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

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

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

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

3

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

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

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

Что может сделать значительную разницу - читаемость и, следовательно, вероятность ошибок при записи/изменении. Я бы (и вы, Шелдоны, возможно, захотите закрыть глаза), избегайте использования «!» Оператор com-PLETELY. «Гасп! Мой - СЛОВО!» Да, я это сказал. И Я ВМЕСТЕ! С СТРАСТЬЮ! Слишком легко пропустить, поскольку это часто рядом с похожим на вид символом пунктуации (то есть «(») слева и похожий на вид буквой идентификатора (то есть «I») справа. И отсутствие этого может иметь серьезные последствия, так как это будет означать, что вы считаете, что код делает точный OPPOSITE того, что он на самом деле делает! И это также может быть значительно более вероятно упущено дислексией, что делает его потенциально проблемой прав на инвалидность, защищенную ADA.

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

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

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

if (false.Equals(IsIisServerConnected)) 
    if 
    (
    IsOfflineMode 
    || false.Equals 
    (
     IsIisLocalServerConnected 
     || IsIisCloudServerConnected 
    ) 
    ) 

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

if (false.Equals(foo == null)) 

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

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

if (IsIisServerConnected.Not()) 
if ((foo == null).Not()) 
Смежные вопросы