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

Эти эквиваленты:

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

а также

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

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

Ответов (5)

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

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

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

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

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

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

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

Вам также следует взглянуть на: http://en.wikipedia.org/wiki/Null_Object_pattern

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

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

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

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

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

Это не удастся, если значение null находится слева, но, вероятно, не произойдет, если значение null справа.

Однако это довольно далекий случай.

В

if (null==myobject) {

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

if (variable == 1) {

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

if (variable = 1) { 

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

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

if (1 == variable) {

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