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 ( M1
e M2
nel 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é null
non c'è differenza con ciò a cui siamo abituati con C # 6. Tuttavia, le cose diventano interessanti quando si null
passa 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)1
quello che avresti scritto normalmente, farà davvero la differenza. is
prende in considerazione il tipo dall'altra parte del confronto. È fantastico!
Penso che il modello == null
vs. is null
costante sia qualcosa che è molto familiare "per caso", in cui la sintassi is
dell'operatore e dell'operatore uguale producono lo stesso risultato.
Come ha commentato svick , is null
chiama 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.