Tenía la impresión de que en C#, los elementos struct se asignan en la pila y desaparecen cuando regresan de un método en el que se crearon. Pero, ¿qué sucede si coloco los valores de estructura en una lista y lo devuelvo? Los elementos sobreviven ¿Las instancias de la estructura a veces se asignan en el montón?¿Las estructuras siempre se asignan asignadas o, a veces, se asignan montones?
internal struct Stru
{
public int i;
}
internal class StruTry
{
public List<Stru> Get(int max)
{
var l = new List<Stru>();
for (int i = 0; i < max; i++)
l.Add(new Stru {i=i});
return l;
}
}
código de impresión 0, 1, 2
[Test]
public void T()
{
var ll = new StruTry().Get(3);
foreach (var stru in ll)
Console.WriteLine("* "+ stru.i);
}
Ese último punto acerca de solo preocuparse por "estoy pasando por valor o por referencia" y no "es mi objeto en la pila o en el montón" - es difícil para mí porque programo principalmente en C++. Creo que cualquier programador C/C++ piensa en términos de dónde vive un objeto. En C/C++, las estructuras (y las clases en C++) pueden vivir en cualquier lugar dependiendo de cómo se declaran. Parece que lo principal para cualquier programador de C/C++ para trabajar en C# es romper con este hábito y nunca pensar en dónde vive un objeto. –
@jason ¿Qué hay de las estructuras genéricas como struct sockaddr, cómo se puede asignar la pila sin saber el tamaño correcto de la misma (ya que esta estructura genérica es por definición más pequeña que la estructura de IPv6 sockaddr_in6) – Bionix1441
@jason ¿Qué significa esto "si son el valor de una variable del tipo de valor que se ha cerrado sobre "? – Pingpong