Es scheint, als würde in jedem .NET-Buch von Werttypen im Vergleich zu Referenztypen die Rede sein, und es wird darauf hingewiesen, dass (häufig fälschlicherweise) angegeben wird, wo jeder Typ gespeichert ist - der Heap oder der Stack. Normalerweise ist es in den ersten Kapiteln und als eine wichtige Tatsache dargestellt.
Ich stimme vollkommen zu; Ich sehe das die ganze Zeit.
Warum werden in .NET-Büchern Stapel- und Heapspeicherzuweisungen behandelt?
Ein Grund dafür ist, dass viele Menschen aus einem C- oder C ++ - Hintergrund zu C # (oder anderen .NET-Sprachen) gekommen sind. Da diese Sprachen die Regeln zur Speicherlebensdauer für Sie nicht durchsetzen, müssen Sie diese Regeln kennen und Ihr Programm sorgfältig implementieren, um sie zu befolgen.
Nun, wohl wissend , diese Regeln und nach ihnen in C nicht erforderlich , dass Sie „den Haufen“ und „den Stapel“ zu verstehen. Wenn Sie jedoch verstehen, wie die Datenstrukturen funktionieren, ist es oft einfacher, die Regeln zu verstehen und zu befolgen.
Wenn ein Anfängerbuch geschrieben wird, ist es für einen Autor selbstverständlich, die Konzepte in derselben Reihenfolge zu erklären, in der er sie gelernt hat. Dies ist nicht unbedingt die Reihenfolge, die für den Benutzer sinnvoll ist. Ich war vor kurzem technischer Redakteur für Scott Dormans C # 4-Einsteiger-Buch, und eines der Dinge, die mir gefallen haben, war, dass Scott eine ziemlich vernünftige Reihenfolge für die Themen gewählt hat, anstatt mit den wirklich fortgeschrittenen Themen im Speichermanagement zu beginnen.
Ein weiterer Grund ist, dass auf einigen Seiten in der MSDN-Dokumentation die Überlegungen zum Speicher stark betont werden. Besonders ältere MSDN-Dokumentationen, die noch aus den Anfängen stammen. Ein Großteil dieser Dokumentation weist subtile Fehler auf, die nie beseitigt wurden, und Sie müssen sich daran erinnern, dass sie zu einer bestimmten Zeit in der Geschichte und für ein bestimmtes Publikum geschrieben wurde.
Warum ist Stack vs Heap für (Anfänger-) .NET-Entwickler überhaupt wichtig?
Meiner Meinung nach nicht. Viel wichtiger ist es, Dinge zu verstehen wie:
- Was ist der Unterschied in der Kopiersemantik zwischen einem Referenztyp und einem Werttyp?
- Wie verhält sich ein Parameter "ref int x"?
- Warum sollten Werttypen unveränderlich sein?
Und so weiter.
Du teilst Sachen zu und es funktioniert einfach, oder?
Das ist das Ideal.
Jetzt gibt es Situationen, in denen es wichtig ist. Garbage Collection ist fantastisch und relativ günstig, aber es ist nicht kostenlos. Das Kopieren kleiner Strukturen ist relativ kostengünstig, aber nicht kostenlos. Es gibt realistische Leistungsszenarien, in denen Sie die Kosten für den Erfassungsdruck gegen die Kosten für übermäßiges Kopieren abwägen müssen. In diesen Fällen ist es sehr hilfreich, die Größe, den Ort und die tatsächliche Lebensdauer aller relevanten Speicher genau zu kennen.
In ähnlicher Weise gibt es realistische Interop-Szenarien, in denen bekannt sein muss, was sich auf dem Stapel und auf dem Haufen befindet und was der Garbage Collector möglicherweise bewegt. Aus diesem Grund verfügt C # über Funktionen wie "fixed", "stackalloc" und so weiter.
Aber das sind alles fortgeschrittene Szenarien. Idealerweise muss sich ein Anfänger-Programmierer um nichts von alledem kümmern.