Si se refiere a la objeto (new Foo(i);
), entonces mi entendimiento es que no: esto nunca se asigna en la pila; sin embargo, morirá en la generación cero, por lo que será muy eficiente de recolectar. No pretendo conocer cada rincón oscura y húmeda de la CLI, pero no conozco ningún escenario en C# que conduzca a un tipo de referencia administrado asignado a la pila (cosas como stackalloc
realmente no contar, y son altamente específicos). Obviamente en C++ tienes algunas opciones más, pero luego no es una instancia administrada.
Curiosamente, en MonoTouch/AOT podría se puede recoger inmediatamente, pero esa no es la CLI VM principal (y es para un escenario muy específico).
En cuanto a la variable - que se general será en la pila (y volver a utilizarse para cada iteración del bucle) - pero podría no ser. Por ejemplo, si se trata de un "bloque iterador", todas las variables locales no eliminadas son en realidad campos en la máquina de estados generada por el compilador. Más comúnmente, si la variable es "capturada" (en un método anónimo o expresión lambda, que forman cierres), la variable se transforma en un campo en el contexto de captura generado por el compilador, y está separado por ciclo iteración (ya que foo
está declarado dentro del ciclo). Esto significa que cada uno es por separado en el montón.
En cuanto a i
(la variable de bucle) - si que es capturado, se pone aún más interesante
- en C# no existían 1.2 capturas, sino por la especificación del bucle variable es técnicamente per-iteración
- en C# 2,0 a 4,0, la variable de bucle es compartida (causando la infame captura/foreach pregunta común)
- en C# 5,0 y por encima de la variable de bucle es per-iteración de nuevo
esto sólo se hace una diferencia cuando se captura la variable, pero cambia la semántica de exactamente cómo se manifiesta en la captura del contexto
Típicamente, una variable de bucle es un tipo de valor, que consigue asignado en el pila (en el caso de un bucle). –
Me refiero a una variable asignada dentro del cuerpo del bucle. Actualizaré la pregunta para aclarar. – SimonC
¿Te refieres a la * variable *? o el * objeto *? (conceptualmente muy diferente) –