Il semble que chaque livre .NET parle des types de valeur par rapport aux types de référence et en fait un point vers (souvent de manière incorrecte) l’état où chaque type est stocké - le tas ou la pile. Habituellement, cela fait partie des premiers chapitres et est présenté comme un fait très important.
Je suis complètement d'accord; Je le vois tout le temps.
Pourquoi les livres .NET parlent-ils d'allocation de mémoire pile / pile?
Une des raisons est que beaucoup de gens sont venus en C # (ou dans d’autres langages .NET) à partir d’un arrière-plan C ou C ++. Étant donné que ces langues ne vous imposent pas les règles relatives à la durée de stockage, vous devez les connaître et mettre en œuvre votre programme avec soin pour les suivre.
Maintenant, connaître ces règles et les suivre en C ne nécessite pas que vous compreniez "le tas" et "la pile". Mais si vous comprenez comment fonctionnent les structures de données, il est souvent plus facile de comprendre et de suivre les règles.
Lors de la rédaction d'un livre pour débutant, il est naturel qu'un auteur explique les concepts dans le même ordre qu'il les a appris. Ce n'est pas nécessairement l'ordre qui a du sens pour l'utilisateur. J'étais récemment éditeur technique du livre pour débutants C # 4 de Scott Dorman, et l'une des choses que j'ai appréciées à ce sujet est que Scott a choisi un ordre assez judicieux pour les sujets, plutôt que de commencer sur des sujets assez avancés en gestion de la mémoire.
Une autre partie de la raison est que certaines pages de la documentation MSDN mettent fortement l’accent sur les considérations de stockage. Une documentation MSDN particulièrement ancienne, qui traîne toujours depuis le début. Une grande partie de cette documentation contient des erreurs subtiles qui n'ont jamais été supprimées, et vous devez vous rappeler qu'elle a été écrite à un moment donné de l'histoire et pour un public particulier.
Pourquoi la pile contre le tas est-elle importante pour les développeurs (débutants) .NET?
À mon avis, ce n'est pas le cas. Ce qui est beaucoup plus important à comprendre, ce sont des choses comme:
- Quelle est la différence en sémantique de copie entre un type de référence et un type de valeur?
- Comment se comporte un paramètre "ref int x"?
- Pourquoi les types de valeur devraient-ils être immuables?
Etc.
Vous allouez des choses et ça marche, non?
C'est l'idéal.
Maintenant, il y a des situations dans lesquelles cela compte. La collecte des ordures ménagères est géniale et relativement peu coûteuse, mais elle n’est pas gratuite. Copier de petites structures est relativement peu coûteux, mais n’est pas gratuit. Il existe des scénarios de performances réalistes dans lesquels vous devez équilibrer le coût de la pression de collecte par rapport au coût d'une copie excessive. Dans ces cas, il est très utile de bien comprendre la taille, l'emplacement et la durée de vie réelle de toutes les mémoires pertinentes.
De même, il existe des scénarios d'interopérabilité réalistes dans lesquels il est nécessaire de savoir ce qu'il y a sur la pile et ce qu'il y a sur le tas, et ce que le garbage collector pourrait déplacer. C'est pourquoi C # a des fonctionnalités telles que "fixed", "stackalloc" et ainsi de suite.
Mais ce sont tous des scénarios avancés. Idéalement, un programmeur débutant n'a pas besoin de s'inquiéter de ce genre de choses.