Sembra che ogni libro di .NET parli di tipi di valore rispetto a tipi di riferimento e lo indichi a indicare (spesso in modo errato) dove è archiviato ciascun tipo: l'heap o lo stack. Di solito è nei primi capitoli e presentato come un fatto molto importante.
Sono completamente d'accordo; Lo vedo sempre.
Perché i libri .NET parlano dell'allocazione di memoria stack vs heap?
Una parte del motivo è perché molte persone sono arrivate in C # (o altri linguaggi .NET) da uno sfondo C o C ++. Poiché tali lingue non applicano per te le regole sulla durata della memorizzazione, ti viene richiesto di conoscere tali regole e di implementare attentamente il tuo programma per seguirle.
Ora, conoscere quelle regole e seguirle in C non richiede di capire "l'heap" e "lo stack". Ma se capisci come funzionano le strutture di dati, spesso è più facile capire e seguire le regole.
Quando si scrive un libro per principianti è naturale che un autore spieghi i concetti nello stesso ordine in cui li hanno imparati. Questo non è necessariamente l'ordine che ha senso per l'utente. Di recente sono stato redattore tecnico per il libro per principianti C # 4 di Scott Dorman, e una delle cose che mi è piaciuta è che Scott ha scelto un ordinamento abbastanza sensato per gli argomenti, piuttosto che iniziare su quelli che sono davvero argomenti avanzati nella gestione della memoria.
Un'altra parte del motivo è che alcune pagine della documentazione MSDN enfatizzano fortemente le considerazioni sull'archiviazione. Documentazione MSDN particolarmente vecchia che è ancora in circolazione fin dai primi giorni. Gran parte di quella documentazione presenta errori impercettibili che non sono mai stati escisi e bisogna ricordare che è stata scritta in un determinato momento della storia e per un particolare pubblico.
Perché stack vs heap conta anche per gli sviluppatori .NET (principianti)?
Secondo me no. Ciò che è molto più importante da capire è cose come:
- 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.
Assegni roba e funziona, giusto?
Questo è l'ideale.
Ora, ci sono situazioni in cui è importante. La raccolta dei rifiuti è fantastica e relativamente economica, ma non è gratuita. La copia di piccole strutture intorno è relativamente economica, ma non è gratuita. Esistono scenari realistici di prestazione in cui è necessario bilanciare il costo della pressione di raccolta con il costo della copia eccessiva. In questi casi è molto utile avere una conoscenza approfondita delle dimensioni, della posizione e della durata effettiva di tutta la memoria rilevante.
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 "fixed", "stackalloc" e così via.
Ma quelli sono tutti scenari avanzati. Idealmente, un programmatore principiante non dovrebbe preoccuparsi di nulla di tutto ciò.