Parece que todo livro do .NET fala sobre tipos de valor versus tipos de referência e faz questão de indicar (geralmente incorretamente) onde cada tipo está armazenado - o heap ou a pilha. Geralmente, está nos primeiros capítulos e apresentado como um fato muito importante.
Eu concordo completamente; Eu vejo isso o tempo todo.
Por que os livros do .NET falam sobre alocação de memória pilha versus pilha?
Uma parte do motivo é que muitas pessoas acessaram o C # (ou outras linguagens .NET) com experiência em C ou C ++. Como esses idiomas não impõem para você as regras sobre a vida útil do armazenamento, você deve conhecê-las e implementar seu programa cuidadosamente para segui-las.
Agora, conhecer essas regras e segui-las em C não requer que você entenda "a pilha" e "a pilha". Mas se você entender como as estruturas de dados funcionam, geralmente será mais fácil entender e seguir as regras.
Ao escrever um livro para iniciantes, é natural que um autor explique os conceitos na mesma ordem em que os aprendeu. Essa não é necessariamente a ordem que faz sentido para o usuário. Recentemente, fui editor técnico do livro para iniciantes C # 4 de Scott Dorman e uma das coisas que mais gostei foi que Scott escolheu uma ordem bastante sensata para os tópicos, em vez de começar com tópicos realmente avançados sobre gerenciamento de memória.
Outra parte do motivo é que algumas páginas na documentação do MSDN enfatizam fortemente as considerações de armazenamento. Documentação do MSDN particularmente mais antiga que ainda existe nos primeiros dias. Grande parte dessa documentação possui erros sutis que nunca foram retirados, e você deve se lembrar que ela foi escrita em um momento específico da história e para um público específico.
Por que o stack vs heap é importante para desenvolvedores .NET (iniciantes)?
Na minha opinião, não. O que é muito mais importante entender são coisas como:
- Qual é a diferença na semântica da cópia entre um tipo de referência e um tipo de valor?
- Como um parâmetro "ref int x" se comporta?
- Por que os tipos de valor devem ser imutáveis?
E assim por diante.
Você aloca coisas e simplesmente funciona, certo?
Esse é o ideal.
Agora, existem situações em que isso importa. A coleta de lixo é impressionante e relativamente barata, mas não é gratuita. Copiar pequenas estruturas é relativamente barato, mas não é gratuito. Existem cenários de desempenho realistas nos quais você precisa equilibrar o custo da pressão de coleta e o custo de cópias excessivas. Nesses casos, é muito útil ter uma forte compreensão do tamanho, localização e vida útil real de toda a memória relevante.
Da mesma forma, existem cenários realistas de interoperabilidade nos quais é necessário saber o que está na pilha e o que está na pilha e o que o coletor de lixo pode estar se movendo. É por isso que o C # possui recursos como "fixo", "stackalloc" e assim por diante.
Mas esses são todos os cenários avançados. Idealmente, um programador iniciante não precisa se preocupar com nada disso.