Есть ли разница между ниже двух утвержденийУсловные операторы разница
if (null != obj)
и
if (obj != null)
Если оба считаются одинаковыми, который будет предпочтительнее?
Есть ли разница между ниже двух утвержденийУсловные операторы разница
if (null != obj)
и
if (obj != null)
Если оба считаются одинаковыми, который будет предпочтительнее?
Разницы здесь код генерируется , Оба не будут генерировать точный код, но на практике это не повлияет на результаты или производительность двух операторов.
Однако, если вы создаете свои собственные типы и переопределяете оператор неравенства и выполняете плохую работу, это имеет значение.
Рассмотрим это:
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)
Нет, нет. Это точно то же самое.
Стиль null == obj
иногда используется только для предотвращения распространенной опечатки obj = null
, чтобы случайно присвоить значение null переменной, но с !=
нет абсолютно никаких оснований для этого.
В .NET он на самом деле не компилируется для опечатки obj = null
.
Таким образом, компилятор не позволяет вам случайно это сделать.
Yoda condition исходит из других языков, где отсутствует функция компилятора.
Нет, но второй способ является более общим и более удобным для чтения (и более логично, на мой взгляд)
Первое условие Йоды. Используйте его, вы не должны.
Они точно такие же.
Некоторые люди предпочитают поставить нуль в качестве первой части выражения, чтобы избежать ошибок, как этот
if (obj = null) // should be obj == null
Но, конечно, это не относится к оператору !=
, так что в вашем примере это просто разница в стиле.
и в C# if (obj = null) является компиляционной ошибкой, поскольку «obj = null» не вычисляет логическое значение. – Massif
Применение первой формы
if (blah == obj)
вытекающей из тех дней, когда компилятор не поймает if (obj = blah)
т.е. непреднамеренного назначения, если уровень предупреждения компиляции был установлен максимального
Первый тип заявления пришли из 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++, и вам больше не нужно его использовать.
Они могут быть разными, если идиот переопределяет оператор! =. – CodesInChaos