Ceci est causé par un design Windows décision prise il y a plusieurs années. Le fond de 64 kilo-octets de l'adresse de l'espace est réservé. Un accès à toutes les adresses dans cette gamme est signalé par une référence null exception au lieu de la sous-jacentes violation d'accès. C'était un choix judicieux, un pointeur null peut produire de la lecture ou de l'écriture à des adresses qui ne sont pas réellement de zéro. La lecture d'un champ d'une classe C++ objet par exemple, il a un décalage à partir du début de l'objet. Si l'objet pointeur est null, le code de la bombe de la lecture à une adresse qui est plus grand que 0.
C# n'est pas tout à fait le même problème, la langue garantit qu'une référence null est pris avant que vous pouvez appeler une méthode d'une instance d'une classe. Ce n'est cependant spécifique à une langue, ce n'est pas une fonction CLR. Vous pouvez écrire du code managé en C++/CLI et de générer des non-zéro de pointeur null déréférence. Appel d'une méthode sur un nullptr objet de travaux. Cette méthode gaiement exécuter. Et d'appeler d'autres méthodes d'instance. Jusqu'à ce qu'il tente d'accéder à une variable d'instance ou d'appel d'une méthode virtuelle, ce qui nécessite un déréférencement ce, kaboom ensuite.
Le C# de garantie est très agréable, il fait le diagnostic de référence null problèmes beaucoup plus facile puisqu'ils sont générés sur le site d'appel et de ne pas la bombe quelque part à l'intérieur d'une méthode imbriquée. Et il est beaucoup plus sûr, la variable d'instance peut ne pas déclencher une exception de très grande taille des objets lors de son décalage est supérieure à 64 ko. Assez difficile à faire dans le code managé btw, à la différence de C++. Mais ne vient pas gratuitement, a expliqué dans ce billet de blog.