Aggiornamento: il compilatore Roslyn è stato aggiornato per rendere lo stesso comportamento dei due operatori in assenza di un operatore di uguaglianza sovraccarico . Si prega di vedere il codice nei risultati del compilatore corrente ( M1e M2nel codice) che mostra cosa succede quando non esiste un comparatore di uguaglianza sovraccarico. Entrambi hanno ora il ==comportamento più performante . Se esiste un comparatore di uguaglianza sovraccarico, il codice differisce comunque .
Vedere per le versioni precedenti del compilatore Roslyn l'analisi di seguito.
Perché nullnon c'è differenza con ciò a cui siamo abituati con C # 6. Tuttavia, le cose diventano interessanti quando si nullpassa a un'altra costante.
Prendi questo per esempio:
Test(1);
public void Test(object o)
{
if (o is 1) Console.WriteLine("a");
else Console.WriteLine("b");
}
Il test cede a. Se lo paragoni a o == (object)1quello che avresti scritto normalmente, farà davvero la differenza. isprende in considerazione il tipo dall'altra parte del confronto. È fantastico!
Penso che il modello == nullvs. is nullcostante sia qualcosa che è molto familiare "per caso", in cui la sintassi isdell'operatore e dell'operatore uguale producono lo stesso risultato.
Come ha commentato svick , is nullchiama System.Object::Equals(object, object)dove ==chiamaceq .
IL per 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 per ==:
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
Dal momento che stiamo parlando null, non vi è alcuna differenza poiché ciò fa la differenza solo sulle istanze . Questo potrebbe cambiare quando hai sovraccaricato l'operatore di uguaglianza.