Je pense que c'est une question particulièrement intéressante. J'ai un point de vue qui n'est pas exactement le même que n'importe laquelle des réponses, alors supportez-moi si j'arrive si tard.
La première chose à noter, c'est que null
dans .NET n'est pas tout à fait la même chose que null
dans d'autres contextes, bien qu'il puisse être utilisé pour les modéliser.
Dans SQL par exemple, nous pourrions avoir 1 = null
et 1 <> null
à la fois revenir null
, car il est concept de null
est plus proche de la mathématique, où nul ne correspond pas à quoi que ce soit, y compris nulle, mais il n'est pas précisément inégal à quoi que ce soit . Nous pouvons utiliser C# null
pour cela si nous voulons, mais ce n'est pas tout à fait comment fonctionne la signification par défaut de null
dans .NET fonctionne.
Pour tout type de référence, null a une signification définie spécifique, et éventuellement des significations supplémentaires fournies par le contexte.
La signification spécifique est "il n'y a pas d'exemple de ceci un objet de ce type".Des significations supplémentaires dans un contexte donné pourraient être "la valeur entière est en fait nulle, plutôt que de correspondre à un nombre entier", ou "il n'y a pas une telle collection d'éléments, même vide", ou "c'est la premier tel élément, donc il n'y en a pas plus tôt "et ainsi de suite selon la façon dont nous l'utilisons. (En outre, cela pourrait signifier "oh mon dieu, ce n'était vraiment pas censé être nul, mieux jeter une exception").
Maintenant, nous pourrions vouloir utiliser ces significations additionnelles, à tel point que nous définissons des cas dans lesquels il est significatif qu'un objet soit nul, ou à tout le moins non nul à nul. Cependant, nous avons les limites suivantes:
La définition précise que nulle pour une valeur d'un type de référence signifie qu'il n'y a pas d'exemple de ce type de référence ne va pas disparaître.
La sémantique que x == y
donnera toujours le résultat opposé à x != y
pour un x et y donnés, ne disparaîtra pas.
Par conséquent:
Si nous voulons un type où une instance peut être égal à zéro, il doit être un type de valeur.
Nous devons encore avoir x != null
retourner l'opposé de x == null
.
Maintenant, depuis .NET 2.0, nous avons eu un intégré qui fait précisément que: Nullable<T>
(ou T?
en C# syntaxe). Il a aussi un peu plus de soutien pour l'aider à bien se comporter face à la boxe (ce qui le fait se comporter comme un type de référence, donc sans ce support supplémentaire nous aurions des complications x == null
reviendraient vrai mais (object)x == null
reviendraient
C'est aussi le cas, que Nullable<T>
peut traiter à peu près n'importe quel cas dans lequel nous aimerions faire usage de ce genre de sémantique légèrement différente pour null, ce qui signifie qu'il n'y a pas vraiment de cas si nous 'Equals()
est susceptible de vouloir définir une méthode qui retourne true quand elle est passée à 0.
' null' devrait être égal à 'null': P – Thorarin
" null ne peut jamais être égal à quoi que ce soit d'autre, y compris null "vs" null devrait être égal à null "quelqu'un peut-il décider? –
'null' n'étant pas égal à' null' peut être commun dans les bases de données relationnelles, mais en C# cela n'a aucun sens. 'if (myVar == null) myVar = nouveau SampleClass();'. Cela ne * initialise * pas la variable si null n'est pas égal à null. – Thorarin