(Pour plus d'informations sur le nouvel assistant d'exception dans Visual Studio 2017, consultez la fin de cette réponse)
Considérez ce code:
String s = null;
Console.WriteLine(s.Length);
Cela lèvera un NullReferenceExceptiondans la deuxième ligne et vous voulez savoir pourquoi .NET ne vous dit pas squ'il était nul lorsque l'exception a été levée.
Pour comprendre pourquoi vous n'obtenez pas cette information, vous devez vous rappeler que ce n'est pas la source C # qui s'exécute mais plutôt IL:
IL_0001: ldnull
IL_0002: stloc.0 // s
IL_0003: ldloc.0 // s
IL_0004: callvirt System.String.get_Length
IL_0009: appelez System.Console.WriteLine
C'est l' callvirtopcode qui lance le NullReferenceExceptionet il le fait lorsque le premier argument de la pile d'évaluation est une référence nulle (celle qui a été chargée avec ldloc.0).
Si .NET doit être capable de dire qu'il ss'agit d'une référence nulle, il doit d'une certaine manière suivre que le premier argument de la pile d'évaluation est issu de la forme s. Dans ce cas, il est facile pour nous de voir que c'est snul, mais que se passe-t-il si la valeur est une valeur de retour d'un autre appel de fonction et n'est stockée dans aucune variable? Quoi qu'il en soit, ce type d'informations n'est pas ce que vous voulez garder une trace dans une machine virtuelle comme la machine virtuelle .NET.
Pour éviter ce problème, je vous suggère d'effectuer une vérification d'argument null dans tous les appels de méthode publique (à moins bien sûr que vous n'autorisiez la référence null):
public void Foo(String s) {
if (s == null)
throw new ArgumentNullException("s");
Console.WriteLine(s.Length);
}
Si null est passé à la méthode, vous obtenez une exception qui décrit précisément le problème (c'est-à- sdire null).
Quatre ans plus tard, Visual Studio 2017 dispose désormais d'un nouvel assistant d'exception qui essaiera de dire ce qui est nul quand a NullReferenceExceptionest levé. Il est même capable de vous donner les informations requises lorsque c'est la valeur de retour d'une méthode qui est nulle:

Notez que cela ne fonctionne que dans une version DEBUG.