32 votes

Quelle était la raison de la conception pour faire de null pas un type primitif?

Lors de l'utilisation de la réflexion Type.IsPrimitive sur void type retourne la valeur false.Venant d'un C++ fond c'était surprenant.

En regardant le C# 6.0 spec (Page 82) ne mentionne pas l' void type, ce qui pourrait signifier qu'il n'est pas classé comme un type tout à fait.

Est-il quelque chose dans la langue spec ou autre, qui catégorise void comme quelque chose d'autre. Ou de toute autre discussion ou un tel, qui mentionne la raison derrière tout cela?

47voto

Patrick Hofman Points 22166

Pourquoi ne pas annuler un type primitif? Car il n'est pas quelque chose que vous pouvez instancier. Ce n'est pas un type primitif, ni un type de référence. Il n'est rien du tout.

Eric Lippert décrit quelques "problèmes" avec le type void dans ce post sur l'Ingénierie du Logiciel, qui va dans les détails d' void comme un type à utiliser dans délégués et Actions:

Un système de type est essentiellement un système pour faire des déductions logiques de ce que les opérations sont valables pour des valeurs particulières; un vide de retour de la méthode ne renvoie pas de valeur, donc la question "quelles opérations sont valables sur cette chose?" n'ont aucun sens du tout. Il n'y a pas de "chose" pour qu'il y ait une opération sur, valide ou non valide.

En faire un type primitif, défaites le sens et le but de l' void dans le VES (Virtual Execution System), comme Eric l'explique plus tard:

L'effet d'un appel à une méthode void est fondamentalement différente de celle de l'effet d'un appel à une non-méthode void; une non-méthode void met toujours quelque chose sur la pile, ce qui pourrait devoir être sauté. Une méthode void ne met jamais quelque chose sur la pile.

Rendant void d'un type primitif enfreint cette règle, bien que vous pourriez arguer du fait de son utilité, comme Eric l'explique plus loin dans le post référencé.

12voto

Hans Passant Points 475940

void n'est pas un type, c'est un mot-clé. Tout comme il est en C++, signifie exactement la même chose. Mots-clés jouent un grand rôle joué dans une langue, elles ne peuvent apparaître à certains endroits et l'analyseur est autorisé à faire dur hypothèses sur l'intention du programmeur.

Principalement le rôle est de générer des messages d'erreur. Évident sur une instruction comme celle - return 42; dans une méthode déclarée nulle, vous obtenez un crystal-clear "hey, vous avez dit qu'il ne reviendra pas tout" message d'erreur. Moins évident, c'est qu'elles sont très utiles pour récupérer à partir de la base des erreurs de syntaxe, un manquant de } accolade de fermeture, par exemple, est une jolie erreur de disque dur à récupérer. Lorsque l'analyseur rencontres, void lors de l'analyse d'un corps de méthode, alors il peut réinitialisation de l'analyseur de l'état et de commencer à produire de bons messages d'erreur à nouveau.

Que l' System.Void type existe à tous est un caprice liées aux métadonnées. Ce qui équivaut à un .h de fichier en C++. Ils existent primaire pour faire face à des restrictions techniques en C++, il n'a pas de concept de modules, il utilise un seul passe-modèle de compilation et exige que les déclarations apparaissent toujours avant les définitions. Assez douloureux travail en C++, mais que l'éditeur de l'outillage peut aider un peu. Aucune restriction de ce genre en C#, le compilateur génère la déclaration de la définition.

Les métadonnées décrit une méthode en détail, stockée dans un MethodDef et MethodDefSig enregistrements dans les métadonnées. Deux façons simples de la CLR concepteurs pourraient avoir exprimé la notion de "cette méthode ne retourne pas de données". D'une manière évidente, c'est qu'ils ont pu s'en servir un peu dans le MethodAttributes enum, quelque chose comme "HasNoReturnValue". Mais depuis, beaucoup de méthodes ont un non-vide type de retour, et de l'espace est réservé dans le MethodDefSig record de toute façon, ils ont juste pris une sentinelle de la valeur que le type de retour. Système.Void.

La réflexion sur le Système.Type Void n'est généralement pas utile. De façon réaliste, ils auraient pu choisir n'importe quelle valeur pour IsPrimitive et il n'aurait pas fait toute la différence. Faux était un choix logique, il ne décrit pas un type.

8voto

No1_Melman Points 1516

À la lecture de la Spécification C#, il n'est fait mention d'un type void. Il est écrit en return type. Dans la table des matières, il n'est pas catégorisé sous la référence ou des types de valeur. Il est mentionné comme un mot-clé.

La section sur l' typeof fonction dit:

La troisième forme de typeof-expression se compose d'un typeof mot-clé suivi par une mise entre parenthèses vide mot-clé. Le résultat d'une expression de cette forme est le Système.Type d'objet que représente l'absence d'un type. Le type de l'objet renvoyé par typeof(void) est distinct de l'objet de type retourné pour n'importe quel type. Ce type spécial d'objet est utile dans les bibliothèques de classes qui permettent la réflexion sur les méthodes dans la langue, où ces méthodes souhaitez avoir un moyen de représenter le type de retour de n'importe quelle méthode, y compris des méthodes void, avec une instance de Système.Type.

Qui m'indique qu' void est associé à un type, mais n'est utilisé que dans le cas où vous souhaitez réflexion pour vous donner quelque chose de tangible en raison du type de système. Sinon, void est juste un mot-clé.

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