Pourquoi les structures C # ne peuvent-elles pas être héritées?

Je lis CLR via C # par Jeffery Richter et il dit qu’un struct est un type de valeur et ne peut pas être hérité.

Y a-t-il des raisons techniques ou philosophiques?

Edit: Il y a apparemment de sérieuses préoccupations éditoriales à propos de cet article. Voir la section commentaire.

Un peu des deux

Philosophiquement , cela fonctionne – il y a des classes, qui sont le “vrai” bloc de construction pour la programmation orientée object, et il existe des structures, des types de données légers pour le stockage mais permettant des appels de méthode.

Techniquement , être un “type de valeur” signifie que toute la structure – tout son contenu – est (généralement) stockée partout où vous avez une variable ou un membre de ce type. En tant que variable locale ou paramètre de fonction, cela signifie sur la stack. Pour les variables membres, cela signifie stocké entièrement dans le cadre de l’object.

En tant qu’exemple (principal) de la raison pour laquelle l’inheritance est un problème, considérez comment le stockage est affecté à un faible niveau si vous autorisez les structures à avoir des sous-types avec plus de membres. Tout ce qui stocke ce type de structure prendrait une quantité de mémoire variable en fonction du sous-type qu’il contenait, ce qui constituerait un cauchemar d’allocation. Un object d’une classe donnée n’aurait plus de taille constante et connue au moment de la compilation, et il en serait de même pour les frameworks de stack de tout appel de méthode. Cela ne se produit pas pour les objects dont le stockage est alloué sur le tas et qui ont des références de taille constante à ce stockage sur la stack ou à l’intérieur d’autres objects.

Ceci est juste une explication intuitive de haut niveau – Voir les commentaires et autres réponses pour des informations plus étendues et plus précises.

Parce que c’est la façon dont les structures sont représentées dans .NET. Ce sont des types de valeur et les types de valeur n’ont pas de pointeur de table de méthode permettant l’inheritance.

Vous pouvez trouver les réponses à SO Question Pourquoi les types de valeur .NET sont-ils scellés? pertinent. Dans ce document, @logicnp fait référence à ECMA 335 , qui stipule:

8.9.10 Héritage de type valeur

  • […]
  • Sera scellé pour éviter de faire face aux complications du découpage en valeur.
  • Les règles plus ressortingctives spécifiées ici permettent une implémentation plus efficace sans compromettre gravement les fonctionnalités.