Quelle est la difference entre "x is null" et "x == null" ?

Quelle est la difference entre “x is null” et “x == null” ?

Mise a jour : Le compilateur Roslyn a ete mis a jour pour rendre le comportement des deux operateurs identique lorsqu’il n’y a pas d’operateur d’egalite surcharge. Veuillez consulter le code dans les resultats actuels du compilateur (M1 et M2 dans le code) qui montre ce qui se passe lorsqu’il n’y a pas de comparateur d’egalite surcharge. Ils ont tous les deux maintenant le comportement == plus performant. S’il y a un comparateur d’egalite surcharge, le code differe toujours.

Consultez ci-dessous pour l’analyse des anciennes versions du compilateur Roslyn.

Pour null, il n’y a pas de difference avec ce a quoi nous sommes habitues en C# 6. Cependant, les choses deviennent interessantes lorsque vous changez null pour une autre constante.

Prenez cet exemple :

Test(1);

public void Test(object o)
{
    if (o is 1) Console.WriteLine("a");
    else Console.WriteLine("b");
}

Le test donne a. Si vous comparez cela avec o == (object)1 que vous auriez normalement ecrit, cela fait une grande difference. is prend en compte le type de l’autre cote de la comparaison. C’est pratique !

Nous pensons que le pattern constant == null vs. is null est simplement quelque chose de tres familier “par accident”, ou la syntaxe de l’operateur is et de l’operateur d’egalite donnent le meme resultat.

Comme svick l’a commente, [is null appelle System.Object::Equals(object, object) tandis que == appelle ceq](SharpLab

(Reponse tronquee)