Ar Structs visada pasirenka pasirinktą ar kartais krūva?

Man susidarė įspūdis, kad C # struktūroje elementai yra skirstomi į kaminą ir tokiu būdu išnyksta, kai grįžta iš metodo, kuriuo jie buvo sukurti. Bet kas atsitiks, jei į sąrašą įtrauksiu struktūrines vertybes ir grąžinu? Elementai išgyvena. Ar krūva kartais pasirenkami struktūros pavyzdžiai?

 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; } } 

spausdinimo kodas 0, 1, 2

 [Test] public void T() { var ll = new StruTry().Get(3); foreach (var stru in ll) Console.WriteLine("* "+ stru.i); } 
28
31 янв. Carlo V. Dango nustatytą sausio 31 d 2011-01-31 19:19 '11, 19:19, 2011-01-31 19:19
@ 6 atsakymai

Pirmiausia perskaitykite šį įrašą iš Erico Lipperto „ The Stack“ - tai įgyvendinimo aprašymas . Sekite ją tiesos apie vertybių tipus pagalba . Kalbant apie konkretų klausimą

Ar krūva kartais pasirenkami struktūros pavyzdžiai?

Taip, jie kartais išsiskiria krūva. Yra daug pavyzdžių, kada jie gali būti paryškinti. Jei jie yra dėžutėje, arba yra klasės laukai, arba yra masyvo elementai, arba yra vertės uždarymo vertės kintamojo vertė, kuri buvo uždaryta ir tt

Bet kas atsitiks, jei pateiksiu struktūrines vertes ir grąžinsiu? Elementai išgyvena.

Jūs manote apie tai teisingai, ir tai yra vienas iš pagrindinių taškų, kur galima paryškinti vertės tipą. Išsamesnės informacijos žr. Skyriuje „Tiesa apie vertę“ minėtas antrasis pranešimas. Bet tiesiog laikykite steką įgyvendinimo detalėse. Pagrindinė išvada yra ta, kad jums tikrai nereikia jaudintis. Jūs turėtumėte domėtis semantiniu skirtumu tarp vertės tipų ir nuorodų tipų.

41
31 янв. atsakymas duotas jasonas 31 d 2011-01-31 19:22 '11, 19:22, 2011-01-31 19:22

Struktūros yra panašios į ints. Jei turite vietinę intą, tai dažniausiai yra sklype, jei turite ints sąrašą, jie yra saugomi tiesiai į sąrašo vidinę masyvą. Struktūros veikia taip pat.

12
31 янв. Marcelo Cantos atsakymas, sausio 31 d 2011-01-31 19:23 '11, 19:23, 2011-01-31 19:23

Bet kas atsitiks, jei pateiksiu struktūrines vertes ir grąžinsiu? Elementai išsaugomi.

Techniškai vertės, pridėtos prie „Sąrašo“, nėra tos pačios vertės, jos yra vertėmis pagrįstos kopijos. Jei, pvz., Pakeisite originalą, šie pakeitimai nebus perkelti į kopiją sąraše. Be to, „Sąrašas“ grąžina nurodytos indekso vertės kopiją. Tai reiškia, kad pakeitus struktūrą ir pakeisdami iš sąrašo grąžinamą vertę, List<t> reikšmė lieka nepakitusi. Tai netaikoma matricoms, nes masyvo indeksas suteikia prieigą prie faktinio kintamojo.

5
13 февр. Atsakymas pateikiamas Trisped 13 Feb. 2013-02-13 23:37 '13, 23:37 2013-02-13 23:37

Visi tipai gali būti platinami krūvoje. Be to, krūva / kamino yra CLR įgyvendinimo detalė, o ne C # specifikacija, todėl niekada neturėtumėte pasikliauti tokiais dalykais. Čia rasite gerą dienoraščio įrašą šiuo klausimu.

1
31 янв. atsakymą pateikė fearofawhackplanet sausio 31 d 2011-01-31 19:23 '11, 19:23, 2011-01-31 19:23

Iš to, ką prisimenu ...

Vertės tipų vieta priklauso nuo to, kur jie yra deklaruojami. Metodo kintamieji skirstomi, saugomi kaminai ir ištrinami po to, kai metodas įvykdomas kamino rėmelyje. Vertės tipai, deklaruoti kaip etaloninio tipo dalis, yra saugomi krūvoje, esančioje uždarojo tipo struktūroje.

Leiskite man žinoti, jei aš neteisus!

1
31 янв. Matthew Abbott atsakymas sausio 31 d 2011-01-31 19:24 '11, 19:24, 2011-01-31 19:24

Tipo struktūros saugojimo vieta (kintamasis, laukas, parametras, masyvo lizdas ir kt.) Saugo struktūros viešuosius ir privačius laukus. Jei ši saugojimo vieta yra ant kamino, struktūros laukai bus ant kamino. Jei jis yra kitoje klasėje ar struktūroje, struktūros laukai bus saugomi kaip kito šios klasės ar struktūros pavyzdys.

Klasės tipo saugojimo vietoje yra nuoroda į pilnos klasės objektą, kuris visada yra (1) saugomas kažkur visiškai atskirai nuo saugojimo vietos, kurioje yra nuoroda, arba (2) klasės objektas, kurio saugojimo vieta yra laukas.

1
15 февр. atsakymą supercat pateikė vasario 15 d. 2013-02-15 23:28 '13, 23:28, 2013-02-15 23:28

Žr. Kitus klausimus, susijusius su žymėmis, arba Užduoti klausimą