77 votes

Pourquoi "null" est-il présent en C # et en Java?

Nous avons remarqué que beaucoup de bugs dans notre logiciel développé en c# (ou java) provoque une NullReferenceException.

Y a-t-il une raison pour laquelle « null » a même été inclus dans la langue ?

Après tout, s’il n’y a aucun « null », je n’aurais aucun bogue, droite ?

En d’autres termes, quelle fonctionnalité de langage ne pouvait pas travailler sans valeur null ?

93voto

Julien Hoarau Points 23987

Anders Hejlsberg, "C# père", il a tout simplement parlé sur ce point dans son Computerworld interview:

Par exemple, dans le système de type, nous n'avons pas de séparation entre la valeur et les types référence et de la valeur null de types. Cela peut sembler un peu bancale ou un peu technique, mais en C# les types de référence peut être null, tels que des chaînes, mais des types de valeur ne peut pas être null. C'est sûr qu'il serait bien d'avoir eu non nullable types de référence, de sorte que vous pouvez déclarer que " cette chaîne ne peut jamais être nulle, et je veux que vous le compilateur de vérifier que je ne peux jamais frappé un pointeur null.

50% des bugs que les gens courent dans aujourd'hui, le codage avec C# dans notre plate-forme, et la même chose est vraie de Java, sont probablement référence null exceptions. Si on avait eu un fort système de type qui vous permettra de dire que "ce paramètre ne peut jamais être nulle, et vous compilateur veuillez vérifier qu'à chaque appel, en faisant l'analyse statique de code". Puis nous avons pu étouffer les classes de bugs.

Cyrus Najmabadi, un ancien ingénieur de conception logiciel sur l'équipe C# (qui travaille maintenant à Google) de discuter sur le sujet sur son blog: (1er, 2e, 3e, 4e). Il semble que le plus grand obstacle à l'adoption de la non-types nullables est que la notation pourrait déranger les programmeurs et habitudes de la base de code. Quelque chose comme 70% des références de C# les programmes sont susceptibles de se retrouver comme non nullable.

Si vous voulez vraiment avoir non nullable type de référence en C# vous devriez essayer d'utiliser Spec# qui est un C# extension de permettre l'utilisation de "!" un non nullable signe.

static string AcceptNotNullObject(object! s)
{
    return s.ToString();
}

30voto

Jon Skeet Points 692016

Nullité est une conséquence naturelle de types référence. Si vous avez une référence, il doit faire référence à un objet - ou avoir la valeur null. Si vous étiez à interdire la nullité, vous devrez toujours vous assurer que chaque variable a été initialisée avec une expression non null - et même dans ce cas, vous auriez des questions si les variables ont été lus au cours de la phase d’initialisation.

Comment proposeriez-vous de supprimer le concept de nullité ?

20voto

Craig Stuntz Points 95965

Comme beaucoup de choses dans la programmation orientée objet, tout va revenir à ALGOL. Tony Hoare vient d’appeler il son « erreur de milliards de dollars ». Si quoi que ce soit, c’est un euphémisme.

Voici une thèse très intéressante sur comment faire de possibilité de valeur null pas la valeur par défaut de Java. Les parallèles en c# sont évidents.

17voto

Mark Cidade Points 53945

Null en C# est la plupart du temps un report de C++, qui avait pointeurs que n'ont pas pour rien dans la mémoire (ou plutôt, adresse 0x00). Dans cette interview, Anders Hejlsberg dit qu'il serait comme d'avoir ajouté non nullable types de référence en C#.

Null a aussi une place légitime dans un système de type, cependant, que quelque chose de semblable à la nature du fond (où object est le top ). En lisp, le type de fond est - NIL et en Scala, c'est - Nothing.

Il aurait été possible de concevoir C# sans les valeurs null mais vous devrez alors venir avec une solution acceptable pour les usages que les gens ont généralement un null, comme unitialized-value, not-found, default-value, undefined-value, et None<T>. Il y aurait probablement été moins adoption entre C++ et Java programmeurs s'ils n'y arriveront de toute façon. Au moins jusqu'à ce qu'ils ont vu que C# programmes n'a jamais eu de pointeur null exceptions.

13voto

Mendelt Points 21583

Suppression de valeur null ne serait pas résoudre une grande partie. Vous devez avoir une référence par défaut pour la plupart des variables qui se trouve sur init. Au lieu de référence null exceptions, vous obtiendriez un comportement inattendu car la variable pointe vers les mauvais objets. Au moins null-références ne parviennent pas rapidement au lieu de provoquer un comportement inattendu.

Vous pouvez regarder le modèle d’objet null pour un moyen de résoudre ce problème

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X