Обновление: компилятор Roslyn был обновлен, чтобы сделать поведение двух операторов одинаковым, когда нет перегруженного оператора равенства . Пожалуйста, смотрите код в результатах текущего компилятора ( M1
и M2
в коде), который показывает, что происходит, когда нет перегруженного компаратора равенства. Они оба теперь ведут себя лучше ==
. Если имеется перегруженный компаратор равенства, код все равно будет другим .
Смотрите более ранние версии компилятора Roslyn ниже анализ.
Потому null
что нет разницы с тем, к чему мы привыкли в C # 6. Однако, вещи становятся интересными, когда вы переходите null
на другую константу.
Возьмите это к примеру:
Test(1);
public void Test(object o)
{
if (o is 1) Console.WriteLine("a");
else Console.WriteLine("b");
}
Тест дает a
. Если вы сравните это с o == (object)1
тем, что написали бы, как обычно, это будет чертовски важно.is
принимает во внимание тип на другой стороне сравнения. Это круто!
Я думаю, что паттерн « == null
против is null
константы» просто очень знаком «случайно», где синтаксис is
оператора и оператора равенства дают один и тот же результат.
Как прокомментировал свик , is null
звонки System.Object::Equals(object, object)
куда ==
звонятceq
.
IL для is
:
IL_0000: ldarg.1 // Load argument 1 onto the stack
IL_0001: ldnull // Push a null reference on the stack
IL_0002: call bool [mscorlib]System.Object::Equals(object, object) // Call method indicated on the stack with arguments
IL_0007: ret // Return from method, possibly with a value
IL для ==
:
IL_0000: ldarg.1 // Load argument 1 onto the stack
IL_0001: ldnull // Push a null reference on the stack
IL_0002: ceq // Push 1 (of type int32) if value1 equals value2, else push 0
IL_0004: ret // Return from method, possibly with a value
Поскольку мы говорим о том null
, что нет никакой разницы, поскольку это имеет значение только в случаях . Это может измениться, если вы перегружаете оператор равенства.