Vra

Aanhaling uit die MSDN-skakel vir ValueType-klas

In gevalle waar dit nodig is dat 'n waardetipe soos 'n objek optree, word 'n omhulsel wat die waardetipe soos 'n verwysingsobjek laat lyk op die hoop toegewys, en die waardetipe se waarde word daarin gekopieer.Die omhulsel is gemerk sodat die stelsel weet dat dit 'n waardetipe bevat.

Dit beteken wanneer ek kode soos "integerVariable.ToString ();" 'n wrapper-voorwerp geskep kan die gebruik van hierdie metode en soortgelyke al die ander metodes van System.Object.

Is hierdie begrip korrek?

Hoe verskil hierdie voorwerpe van die 'gewone' voorwerpe?

Is die vullisversameling anders vir so 'n voorwerp?Indien ja, hoe?

Dankie by voorbaat.

Was dit nuttig?

Oplossing

Die omhulsel is 'n "boks";re vullis versameling van bokse - daar is geen verskil wat die vullisverwyderaar betref.'n Boksie word versamel met presies dieselfde reëls en behandeling as enige ander voorwerp.

egter, as 'n waarde-tipe 'n metode ignoreer (soos ToString()), is dit nie nodig om dit te boks om die metode te noem nie.Dus moet waardetipes (as 'n kwessie van roetine) soveel van die object metodes as moontlik ;-p

Jy kan die verskil in die IL (via reflektor) sien - dus vir die C#:

static int GetInteger() {return 123;}
static string TestToString() {
    int i = GetInteger(); // to prove no cheating
    return i.ToString();
}
static Type TestGetType() {
    int i = GetInteger(); // to prove no cheating
    return i.GetType();
}

Ons het die IL:

.method private hidebysig static string TestToString() cil managed
{
    .maxstack 1
    .locals init (
        [0] int32 i)
    L_0000: call int32 Program::GetInteger()
    L_0005: stloc.0 
    L_0006: ldloca.s i
    L_0008: call instance string [mscorlib]System.Int32::ToString()
    L_000d: ret 
}

.method private hidebysig static class [mscorlib]System.Type TestGetType() cil managed
{
    .maxstack 1
    .locals init (
        [0] int32 i)
    L_0000: call int32 Program::GetInteger()
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: box int32
    L_000c: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
    L_0011: ret 
}

Let daarop dat ToString() behels nie 'n boks nie, maar GetType() doen by L_0007 (aangesien dit nie (kan nie) oorskryf word nie)

Ander wenke

Ja daardie begrip is korrek.

Hierdie voorwerpe verskil nie van 'gewone' voorwerpe in die CLR nie.

Aangesien hierdie voorwerpe (ook 'bokse' genoem omdat hulle waardetipes toevou) net soos enige ander voorwerp is, is die vullisverwyderaar ook dieselfde.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top