Ho avuto l'impressione che in C#, gli elementi struct sono allocati nello stack e quindi scompaiono quando ritornano da un metodo in cui sono stati creati. Ma cosa succede se metto i valori struct in una lista e lo restituisco? Gli elementi sopravvivono. Le istanze di struct sono talvolta allocate nell'heap?Le strutture vengono sempre allocate o talvolta allocate?
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;
}
}
codice di stampa 0, 1, 2
[Test]
public void T()
{
var ll = new StruTry().Get(3);
foreach (var stru in ll)
Console.WriteLine("* "+ stru.i);
}
Quest'ultimo punto riguarda solo "sto passando per valore o per riferimento" e non "è il mio oggetto in pila o l'heap" - è difficile per me perché principalmente programma in C++. Penso che ogni programmatore C/C++ pensi in termini di dove un oggetto vive. In C/C++ le strutture (e le classi in C++) possono vivere in entrambi i posti a seconda di come sono dichiarate. Sembra che la cosa principale per ogni programmatore C/C++ in C# sia di rompere questa abitudine e non pensare mai a dove un oggetto vive. –
@jason Che ne dici di strutture generiche come struct sockaddr, come si può allocare lo stack senza conoscere la giusta dimensione (poiché questa struttura generica è per definizione più piccola della struttura IPv6 sockaddr_in6) – Bionix1441
@jason Che cosa significa "se sono il valore di una variabile di tipo di valore che è stata chiusa su "? – Pingpong