Parece que cada libro de .NET habla sobre los tipos de valor frente a los tipos de referencia y señala (a menudo incorrectamente) dónde se almacena cada tipo: el montón o la pila. Por lo general, se encuentra en los primeros capítulos y se presenta como un hecho muy importante.
Concuerdo completamente; Veo esto todo el tiempo.
¿Por qué los libros .NET hablan sobre la asignación de memoria de pila frente a pila?
Una parte de la razón es porque muchas personas llegaron a C # (u otros lenguajes .NET) desde un fondo C o C ++. Dado que esos idiomas no le imponen las reglas sobre la vida útil del almacenamiento, debe conocer esas reglas e implementar su programa cuidadosamente para seguirlas.
Ahora, conocer esas reglas y seguirlas en C no requiere que comprenda "el montón" y "la pila". Pero si comprende cómo funcionan las estructuras de datos, a menudo es más fácil entender y seguir las reglas.
Al escribir un libro para principiantes, es natural que un autor explique los conceptos en el mismo orden en que los aprendió. Ese no es necesariamente el orden que tiene sentido para el usuario. Recientemente fui editor técnico del libro para principiantes C # 4 de Scott Dorman, y una de las cosas que me gustó fue que Scott eligió una ordenación bastante sensata para los temas, en lugar de comenzar con lo que realmente son temas bastante avanzados en la gestión de la memoria.
Otra parte de la razón es que algunas páginas en la documentación de MSDN enfatizan fuertemente las consideraciones de almacenamiento. Documentación de MSDN especialmente antigua que todavía se mantiene desde los primeros días. Gran parte de esa documentación tiene errores sutiles que nunca se han eliminado, y debe recordar que fue escrita en un momento particular de la historia y para un público en particular.
¿Por qué la pila vs el montón es importante para los desarrolladores (principiantes) de .NET?
En mi opinión, no lo hace. Lo que es mucho más importante de entender es cosas como:
- ¿Cuál es la diferencia en la semántica de copia entre un tipo de referencia y un tipo de valor?
- ¿Cómo se comporta un parámetro "ref int x"?
- ¿Por qué los tipos de valor deben ser inmutables?
Y así.
Usted asigna cosas y simplemente funciona, ¿verdad?
Ese es el ideal.
Ahora, hay situaciones en las que sí importa. La recolección de basura es impresionante y relativamente económica, pero no es gratuita. Copiar pequeñas estructuras alrededor es relativamente económico, pero no es gratis. Hay escenarios de rendimiento realistas en los que debe equilibrar el costo de la presión de recopilación con el costo de la copia excesiva. En esos casos, es muy útil tener una sólida comprensión del tamaño, la ubicación y la vida útil real de toda la memoria relevante.
Del mismo modo, hay escenarios de interoperabilidad realistas en los que es necesario saber qué hay en la pila y qué hay en el montón, y qué podría estar moviendo el recolector de basura. Es por eso que C # tiene características como "fijo", "stackalloc", etc.
Pero esos son todos escenarios avanzados. Idealmente, un programador principiante no debe preocuparse por nada de esto.