Quelle est la différence entre “foo is null” et “foo == null”

Existe-t-il une différence entre: foo is null et foo == null ?

Version courte: Pour les types bien comportés, il n’y a pas de différence entre foo is null et foo == null .

Version longue:

Lorsque vous écrivez foo == null et qu’une surcharge appropriée de l’ operator == existe, c’est ce qui s’appelle. Sinon, l’égalité de référence est utilisée pour les types de référence et l’égalité de valeur pour les types de valeur.

Lorsque vous écrivez que foo is null pour un type de référence, cela est compilé comme si vous object.Equals(null, foo) (notez l’ordre de commutation, cela fait une différence). En effet, ceci effectue une comparaison d’égalité de référence entre foo et null . Pour un type de valeur, foo is null ne comstack pas.

Cela signifie que si vous écrivez une classe avec l’ operator == qui indique qu’une instance de foo est égale à null , alors foo == null donnera un résultat différent de celui de foo is null .

Un exemple montrant ceci:

 using System; public class Foo { public static void Main() { var foo = new Foo(); Console.WriteLine(foo == null); Console.WriteLine(foo is null); } public static bool operator ==(Foo foo1, Foo foo2) => true; // operator != has to exist to appease the comstackr public static bool operator !=(Foo foo1, Foo foo2) => false; } 

Ce code affiche:

 True False 

Lorsque vous surchargez l’ operator == , vous devez le faire se comporter de manière raisonnable, ce qui signifie, entre autres choses, que vous ne devez pas dire que foo == null est true pour foo non null . En conséquence, dans les circonstances normales, foo == null et foo is null auront la même valeur.

À partir des documents MSDN:

Is operator Vérifie si un object est compatible avec un type donné ou, à partir de C # 7, teste une expression avec un motif. Le mot-clé is évalue la compatibilité des types au moment de l’exécution. Il détermine si une instance d’object ou le résultat d’une expression peut être converti en un type spécifié.

== est Pour les types de valeur prédéfinis, l’opérateur d’égalité (==) renvoie true si les valeurs de ses opérandes sont égales, false sinon. Pour les types de référence autres que chaîne, == renvoie true si ses deux opérandes font référence au même object. Pour le type de chaîne, == compare les valeurs des chaînes.

Résumé: Non, il n’y en a pas dans cet exemple. Ceci est normalement utilisé si vous voulez vérifier le type . Dans ce cas, il est nul. == si vous voulez vérifier la valeur. Dans ce cas également, la valeur est égale à true.