It seems like every .NET book talks about value types vs reference types and makes it a point to (often incorrectly) state where each type is stored - the heap or the stack. Usually it's in the first few chapters and presented as some all-important fact.
Sono completamente d'accordo; Lo vedo sempre.
Why do .NET books talk about stack vs heap memory allocation?
Una parte del motivo è dovuta al fatto che molte persone sono venute in C # (o in altri linguaggi .NET) da uno sfondo C o C ++. Poiché tali lingue non impongono le regole sulla durata dello storage, è necessario conoscere tali regole e implementare con attenzione il programma per seguirle.
Ora, conoscendo queste regole e seguendole in C, non richiede di capire "l'heap" e "lo stack". Ma se capisci come funzionano le strutture dati, spesso è più facile capire e seguire le regole.
Quando scrivi un libro per principianti è naturale che un autore spieghi i concetti nello stesso ordine in cui loro li hanno appresi. Questo non è necessariamente l'ordine che ha senso per l'utente. Recentemente sono stato redattore tecnico del libro per principianti del C # 4 di Scott Dorman, e una delle cose che mi è piaciuta è che Scott ha scelto un ordine piuttosto ragionevole per gli argomenti, piuttosto che iniziare su argomenti realmente avanzati nella gestione della memoria. / p>
Un'altra parte del motivo è che alcune pagine della documentazione MSDN sottolineano con forza le considerazioni sull'archiviazione. Documentazione MSDN particolarmente vecchia che è ancora in agguato fin dai primi giorni. Gran parte di quella documentazione ha errori sottili che non sono mai stati escissi, e devi ricordare che è stato scritto in un momento particolare della storia e per un particolare pubblico.
Why does stack vs heap even matter to (beginner) .NET developers?
Secondo me, non è così. Ciò che è molto più importante da capire è roba del tipo:
- Qual è la differenza nella semantica della copia tra un tipo di riferimento e un tipo di valore?
- Come si comporta un parametro "ref int x"?
- Perché i tipi di valore dovrebbero essere immutabili?
E così via.
You allocate stuff and it just works, right?
È l'ideale.
Ora ci sono situazioni in cui è importante. La raccolta dei rifiuti è eccezionale e relativamente economica, ma non è gratuita. Copiare piccole strutture in giro è relativamente economico, ma non è gratuito. Esistono scenari di prestazioni realistici in cui è necessario bilanciare il costo della pressione di raccolta con il costo di una copia eccessiva. In questi casi è molto utile avere una buona comprensione delle dimensioni, della posizione e della durata effettiva di tutta la memoria pertinente.
Allo stesso modo, ci sono scenari di interoperabilità realistici in cui è necessario sapere cosa c'è nello stack e cosa c'è nell'heap, e cosa potrebbe muoversi il garbage collector. Ecco perché C # ha caratteristiche come "fisso", "stackalloc" e così via.
Ma quelli sono tutti scenari avanzati. Idealmente, un programmatore principiante non dovrebbe preoccuparsi di nulla di tutto questo.