Når får structs ikke leve på stakken?

stemmer
5

Jeg leser gjennom Jon Skeet er bokanmeldelser og han kommer over mange unøyaktigheter av Head First C # .

En av dem fanget mitt øye:

[Under Feil Seksjon] Å hevde at structs alltid leve på stakken.

I hvilke situasjoner ville structs ikke leve på stakken? Dette går i motsetning til hva jeg trodde jeg visste om structs.

Publisert på 10/02/2009 klokken 08:48
kilden bruker
På andre språk...                            


6 svar

stemmer
7

Et vanlig eksempel er der struct er et medlem av et objekt som er allokert i haugen. Det er massevis av ekstra detalj i dette spørsmålet her. Hva er forskjellen mellom struct og klasse i Net?

Svarte 10/02/2009 kl. 08:51
kilden bruker

stemmer
4

Når de er et felt på en klasse

Uvanlige eksempler på dette:

a: Når en verdi-type variabel er fanget:

int i = 2;
Action action = delegate {i++;}
action();
Console.WriteLine(i);

Dette er kompilert til noe mer som:

class Foo {
    public int i;
    public void Bar() {i++;}
}
...
Foo foo = new Foo();
foo.i = 2;
Action action = foo.Bar;
action();
Console.WriteLine(foo.i);

b: Når en verdi type variabel brukes i en iteratorblokk:

IEnumerable<int> GetValues() {
   for(int i = 0 ; i < 5 ; i++) yield return i;
}

(kompilatoren skaper en tilstandsmaskin for å representere iteratoren, hvorav alle lokale variabler (for eksempel i) er felt)

Svarte 10/02/2009 kl. 09:06
kilden bruker

stemmer
2

Bare som et eksempel på svaret fra 1800 INFORMASJON :

public class Foo
{
    int x;

    public Foo(int y)
    {
        x = y;
    }
}

...

Foo foo = new Foo(10);

Nå, etter konstruktøren er ferdig utfører, er verdien av foo.xer 10. Hvor er foo.xi minnet? På haugen. Hva er den typen foo.x? intaka System.Int32, som er en struct.

De andre svar om fangede variabler og boksing osv er korrekte så vel ( "slags" i boksing tilfellet - Jeg vil legge til en kommentar), men dette eksempelet er den mest enkleste og viktigste, IMO.

Svarte 10/02/2009 kl. 09:07
kilden bruker

stemmer
2

Når forekomsten av en verditype blir pakket , blir boksen, og følgelig selve forekomsten, flyttet til haugen. Selv er det nødt til å være ingen tvil om at en ikke-klassemedlem verditype eksempel når første laget er alltid laget på stakken.

En struct er et verditype. Så det oppfører seg som ovenfor.

Svarte 10/02/2009 kl. 08:52
kilden bruker

stemmer
0

Boken har gjort feil i forvirrende skrive mekanikere med omfang mekanikk. En verdi typen er ikke en referansetype. Det er data blir kopiert når du kaller en metode å bruke det som et argument (uten ref eller out). Verdityper vil leve videre stabelen i omfanget av en metode i stedet for på haugen som et referanseobjekt gjør, men det betyr ikke at det alltid vil leve på stakken.

Så er boken gjør en bruk uttalelse i stedet for en mekanikk uttalelse, og forvirrende de to. Det er ikke en total grunnløs påstand, men det er galt.

Verdityper vil bli holdt der deres eier er.

Så hvis omfang er en metode, vil de være på stakken. Hvis deres omfang er et objekt, vil de leve med objektet på haugen.

Med det, er det ganske trygt å si, er en verdi-type er best igjen som et uforanderlig, siden de fleste mennesker har en hard tid å forutsi verdi-type mekanikken av verdi.

Svarte 26/01/2012 kl. 20:38
kilden bruker

stemmer
0

Allerede nevnt i dybden av andre

  • Medlem feltverdier
  • eske structs (strengt de er da ikke lenger verdityper)

I tillegg:

  • En rekke structs ligger helt på haugen
  • statiske structs (ikke på stakken eller haugen, men i et spesielt område alle sine egne)
Svarte 10/02/2009 kl. 12:11
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more