2009-12-29 9 views
5

Según http://msdn.microsoft.com/en-us/library/ms229017.aspx, los tipos de valor "se asignan en la pila o en línea con otras estructuras *". Sin embargo, en the stack is an implementation detail, Eric Lippert afirma que se trata de un detalle de implementación.La pila es un detalle de implementación, ¿o no?

Según entiendo, un detalle de implementación es "a behavior produced by code which may be relied on by consuming code, though that behavior is not specified by the spec the code is written to.". Entiendo que la documentación no es una especificación, aunque presumiblemente si hay algo en la documentación en la que podemos confiar y ya no es un detalle de implementación. Entonces, ¿es la pila un detalle de implementación o no?

*: Entiendo que esto signifique que las estructuras también se pueden asignar dentro de otras en lugar de directamente en el montón, aunque podría estar equivocado.

+0

relacionado con la pregunta: http://stackoverflow.com/questions/1970894/struct-what-is-it-for/1970902#1970902 –

+0

Acabo de marcar eso como duplicado hace un tiempo :) – RCIX

Respuesta

11

La documentación de MSDN le informa sobre la implementación particular que el compilador de Microsoft C# usa para struct. Esos detalles particulares no están en la especificación ECMA 334 C#; no son parte de la semántica de struct s. Por lo tanto, esos detalles en la documentación son detalles de implementación.

Me parece recordar haber leído en algún lado a Eric Lippert diciendo que desea (o prefiere, no recuerdo qué nivel de preferencia proporcionó) que la documentación no mencionó la pila en relación con struct s. Veré si puedo desenterrarlo.

aquí está, desde la entrada de blog que se ha vinculado a:

Lamento que la documentación no se centra en lo que es más relevante; al centrarnos en un detalle de implementación en gran parte irrelevante, aumentamos la importancia de ese detalle de implementación y oscurecemos la importancia de lo que hace que un tipo de valor sea semánticamente útil. Deseo sinceramente que todos los artículos que explican qué es "la pila" pasen más tiempo explicando qué significa exactamente "copiado por valor" y cómo la incomprensión o el uso indebido de "copiar por valor" puede causar errores.

La sección correspondiente de la especificación ECMA 334 C# es §11. Tenga en cuenta que la palabra "pila" nunca se usa en esta sección. La sección simplemente explica la sintaxis, que struct sigue la semántica de valores, que están sellados implícitamente y heredan de System.ValueType, que la asignación a una variable del tipo struct crea una copia, que al pasar un struct como un parámetro por valor crea una copia, cómo struct s se ajustan a valores por defecto (todos los campos de tipo de valor en el struct se establecen en sus valores por defecto, y todos los campos de tipo de referencia se establecen en null), las reglas que rodean el boxeo y unboxing de struct, el significado de this para struct s , y cómo la inicialización de campo, los constructores, los destructores y los constructores estáticos funcionan para struct s. Nuevamente, no hay mención de pilas. Nunca.

La pila es un detalle de implementación, no parte de la semántica de struct.

1

Para los tipos de valores C# la 'pila' es un detalle de implementación porque cada operación segura realizada en el tipo de valor se comportará de la misma manera, ortogonal a si la estructura se asignó en pila o en montón.

Las operaciones para las cuales marcaría la diferencia (es decir, terminar haciendo referencia a un marco de pila desasignado), como tomar la dirección y usarla directamente (por ejemplo, mediante API heredadas), son inseguras y erróneas (es decir, no usando una API de Marshaling).

Cuestiones relacionadas