2011-02-10 3 views
7

Есть ли разница между ниже двух утвержденийУсловные операторы разница

if (null != obj) 

и

if (obj != null) 

Если оба считаются одинаковыми, который будет предпочтительнее?

+7

Они могут быть разными, если идиот переопределяет оператор! =. – CodesInChaos

ответ

7

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

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

Рассмотрим это:

public class TestClass 
{ 
    ... 

    public static bool operator !=(TestClass left, TestClass right) 
    { 
     return !left.Equals(right); 
    } 
} 

В этом случае, если первый аргумент оператора равно нулю, то есть. if (null != obj), то он сработает с NullReferenceException.

Итак, подведем итог:

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

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

if (null == obj) 

Обратите внимание, что я перешел на проверку равенства здесь. Причина в том, что частая ошибка в программах, написанных со старыми компиляторами C (в наши дни они склонны уловить эту проблему) заключалась бы в том, чтобы переключить ее и забыть один из равных символов, т.е. это:

if (obj = null) 

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

if (null = obj) 
2

Нет, нет. Это точно то же самое.

Стиль null == obj иногда используется только для предотвращения распространенной опечатки obj = null, чтобы случайно присвоить значение null переменной, но с != нет абсолютно никаких оснований для этого.

В .NET он на самом деле не компилируется для опечатки obj = null.
Таким образом, компилятор не позволяет вам случайно это сделать.

Yoda condition исходит из других языков, где отсутствует функция компилятора.

+0

И компилятор предупредит вас, если вы случайно используете '=' вместо '=='. – LukeH

+0

Да, я просто собирался добавить это для .NET. –

+0

они не совсем то же самое, если obj переопределяет соответствующий оператор, результат может быть другим. – Massif

4

Нет, но второй способ является более общим и более удобным для чтения (и более логично, на мой взгляд)

20

Первое условие Йоды. Используйте его, вы не должны.

1

Они точно такие же.

Некоторые люди предпочитают поставить нуль в качестве первой части выражения, чтобы избежать ошибок, как этот

if (obj = null) // should be obj == null 

Но, конечно, это не относится к оператору !=, так что в вашем примере это просто разница в стиле.

+0

и в C# if (obj = null) является компиляционной ошибкой, поскольку «obj = null» не вычисляет логическое значение. – Massif

0

Применение первой формы

if (blah == obj) 

вытекающей из тех дней, когда компилятор не поймает if (obj = blah) т.е. непреднамеренного назначения, если уровень предупреждения компиляции был установлен максимального

0

Первый тип заявления пришли из C/C++, где это было возможно передать не булевы значения условию проверки. Например. ничего не 0 было правдой, и ноль был ложным:

if (5) { } // true 
if (0) { } // false 

Иногда это создавало проблемы, если вы забыли ввести один «=» символ:

if (x = 5) { } // this was true always and changed x value 
if (x == 5) { } // this was true, if x was equal to 5 

Таким образом, был использован синтаксис Yoda, чтобы получить компилятор ошибка в случае, если один '=' было пропущено:

if (5 = x) { } // this was generating compiler error for absent-minded programmers 
if (5 == x) { } // this was true, if x was equal to 5 

C# позволяют только логическое значение в условиях, так

if (x = 5) { } // this won't compile 
if (x == 5) { } // this is true, if x was equal to 5 

Как насчет булевых типов?

if (y = true) { } 
if (y == true) { } 

Ну, это бесполезный код, потому что вы можете просто написать if (y). Заключение: синтаксис Yoda ушел с C/C++, и вам больше не нужно его использовать.

Смежные вопросы