Sök…


Anmärkningar

Det är värt att notera att det ursprungliga värdet kommer att vara null deklarerar en referenstyp. Det beror på att det ännu inte pekar på en plats i minnet och är ett giltigt tillstånd.
Men med undantag av nollbara typer måste värdetyper vanligtvis alltid ha ett värde.

Värdetyper i användning

Värdetyper innehåller helt enkelt ett värde .

Alla värdetyper härrör från klassen System.ValueType , och detta inkluderar de flesta av de inbyggda typerna.

När du skapar en ny värdetyp används ett minnesområde som kallas stacken .
Bunten kommer att växa i enlighet med storleken på den deklarerade typen. Så till exempel kommer en int alltid att tilldelas 32 bitar minne på bunten. När värdetypen inte längre är i omfattning kommer utrymmet på stacken att delas upp.

Koden nedan visar en värdetyp som tilldelas en ny variabel. En struktur används som ett bekvämt sätt att skapa en anpassad värdetyp (klassen System.ValueType kan inte utökas på annat sätt).

Det viktiga att förstå är att när man tilldelar en värdetyp kopieras själva värdet till den nya variabeln, vilket betyder att vi har två distinkta instanser av objektet, som inte kan påverka varandra.

struct PersonAsValueType
{
    public string Name;
}

class Program
{
    static void Main()
    {
        PersonAsValueType personA;

        personA.Name = "Bob";

        var personB = personA;

        personA.Name = "Linda";

        Console.WriteLine(                // Outputs 'False' - because 
            object.ReferenceEquals(       // personA and personB are referencing 
                personA,                  // different areas of memory
                personB));                

        Console.WriteLine(personA.Name);  // Outputs 'Linda'
        Console.WriteLine(personB.Name);  // Outputs 'Bob'
    }
}

Referenstyper som används

Referenstyper består av både en referens till ett minnesområde och ett värde lagrat inom det området.
Detta är analogt med pekare i C / C ++.

Alla referenstyper lagras på vad som kallas högen .
Högen är helt enkelt ett hanterat minnesområde där objekt lagras. När ett nytt objekt instanseras, kommer en del av högen att tilldelas för användning av det objektet, och en referens till den platsen för högen kommer att returneras. Högen hanteras och underhålls av avfallssamlaren och tillåter inte manuell ingripande.

Förutom det minnesutrymme som krävs för själva instansen krävs ytterligare utrymme för att lagra referensen själv, tillsammans med ytterligare tillfällig information som krävs av .NET CLR.

Koden nedan visar att en referenstyp tilldelas en ny variabel. I det här fallet använder vi en klass, alla klasser är referenstyper (även om de är statiska).

När en referenstyp tilldelas en annan variabel är det referensen till objektet som kopieras över, inte värdet i sig. Detta är en viktig åtskillnad mellan värdetyper och referenstyper.

Konsekvenserna av detta är att vi nu har två referenser till samma objekt.
Alla ändringar i värdena inom det objektet kommer att återspeglas av båda variablerna.

class PersonAsReferenceType
{
    public string Name;
}

class Program
{
    static void Main()
    {
        PersonAsReferenceType personA;

        personA = new PersonAsReferenceType { Name = "Bob" };

        var personB = personA;

        personA.Name = "Linda";

        Console.WriteLine(               // Outputs 'True' - because
            object.ReferenceEquals(      // personA and personB are referencing 
                personA,                 // the *same* memory location
                personB));

        Console.WriteLine(personA.Name); // Outputs 'Linda'
        Console.WriteLine(personB.Name); // Outputs 'Linda'
    }


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow