Обновление: компилятор 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, что нет никакой разницы, поскольку это имеет значение только в случаях . Это может измениться, если вы перегружаете оператор равенства.