Ответ 1
Обновление: компилятор Roslyn был обновлен, чтобы сделать поведение двух операторов одинаковым, когда нет перегруженного оператора равенства. Пожалуйста, смотрите ilr/K4Zwlgdg5gBAygTxAFwKYFsDcAoADsAIwBswBjGUogQxBBgGEYBvbGNmAge06JgFkAjAApOBAFapSyGAA8AlDAC8APlkwwdCMCJEcASC49 AJhHjJ0 UtUylimFp04AvkA== rel="nofollow noreferrer">код в результатах текущего компилятора (M1
и M2
в коде), который показывает, что происходит, когда нет перегруженного средства сравнения равенства. У них обоих теперь лучше поведение ==
. Если имеется перегруженный компаратор равенства, код все равно будет другим.
Смотрите более ранние версии компилятора Roslyn ниже анализ.
Для null
нет разницы с тем, к чему мы привыкли в С# 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
vs. is null
константа просто очень знаком "случайно", где синтаксис оператора is
оператор equals дают одинаковый результат.
Как прокомментировал svick, ilr/K4Zwlgdg5gBAygTxAFwKYFsDcAoADsAIwBswBjGUogQxBBgGEYBvbGNmAge06JgFkAjAApOBAFapSyGAA8AlDAC8APlkwwdCMCJEcASC49 AJhHjJ0 UtUylimFp04AvkA== rel="nofollow noreferrer"> 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
, нет никакой разницы, поскольку это имеет значение только в случаях. Это может измениться, если вы перегружаете оператор равенства.