С#: сравнение с нулевым

Являются ли эти эквиваленты:

if (null==myobject)
{
//do something 
}

и

if (myobject==null)
{
//do something 
}

или они будут создавать другой код?

Ответы

Ответ 1

В 99% случае этот код эквивалентен.

Единственное исключение - когда тип рассматриваемого объекта переопределяет оператор ==. Возможно, что ошибка возникает в ==, которая вызывает проблемы, когда один параметр имеет значение null.

Частным примером, который я видел ранее, является следующий

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

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

Это довольно удаленный угол.

Ответ 2

Форма оператора "if", которая ставит константу слева, представляет собой сохранение из C/С++, где вы можете иметь произвольное выражение в выражении if.

Синтаксис С# для операторов if требует, чтобы выражение оценивалось в bool, что означает, что if (foo = 0) не будет компилироваться.

Ответ 3

if (null==myobject) {

- безопасный способ написания оператора if. Он исходит из C/С++, где условие является выражением, вычисленным для int. Если результат равен нулю, что означает false, все остальное - true. Вы могли бы написать что-то вроде

if (variable == 1) {

но если вы не будете осторожны, вы также можете написать

if (variable = 1) { 

в этом случае у вас есть задание, которое всегда оценивается как 1 и, следовательно, всегда верно.

Вы можете скомпилировать это и запустить его без проблем, но результат не будет тем, что вы ожидали. Поэтому программисты C/С++ начали писать такие вещи, как

if (1 == variable) {

Это не скомпилируется, если вы опечатаете его, поэтому вам всегда приходилось писать его, как вы хотели его написать. Это позже становится (хорошей) привычкой, и вы используете его на всех языках, с которыми вы работаете, например с С#.

Ответ 4

Для тех, кто его пропустит, если вы хотите уменьшить беспорядок, также можно включить C-language -уровень проверки нуля для ваших классов C#:

class MyObj
{
    public void implicit_null_comparison_demo()
    {
        MyObj mo = null;
        // ...

        if (mo)         //  <-- like so (can also use !mo)
        {
            // it not null...
        }
        else
        {
            // it null...
        }
    }

    public static implicit operator bool(MyObj mo)
    {
        return (Object)mo != null;
    }
};

Ответ 5

Как отмечают другие, они в основном эквивалентны.

Вы также должны посмотреть: http://en.wikipedia.org/wiki/Null_Object_pattern

Это очень полезная альтернатива просто проверке нулевой ссылки.