.NET Framework
Stapel en hoop
Zoeken…
Opmerkingen
Het is vermeldenswaard dat de initiële waarde bij het declareren van een referentietype null
. Dit komt omdat het nog niet verwijst naar een locatie in het geheugen en het is een perfect geldige status.
Met uitzondering van nulbare typen moeten waardetypes doorgaans altijd een waarde hebben.
Waardetypes in gebruik
Waardetypes bevatten eenvoudig een waarde .
Alle waardetypen zijn afgeleid van de klasse System.ValueType , en dit omvat de meeste ingebouwde typen.
Bij het maken van een nieuw waardetype wordt het geheugengebied met de naam stack gebruikt.
De stapel zal dienovereenkomstig groeien, met de grootte van het aangegeven type. Een int zal bijvoorbeeld altijd 32 bits geheugen op de stapel toegewezen krijgen. Wanneer het waardetype niet langer binnen het bereik valt, wordt de ruimte op de stapel gedelocaliseerd.
De onderstaande code toont een waardetype dat wordt toegewezen aan een nieuwe variabele. Een struct wordt gebruikt als een handige manier om een aangepast waardetype te maken (de klasse System.ValueType kan anders niet worden uitgebreid).
Het belangrijkste om te begrijpen is dat bij het toewijzen van een waardetype de waarde zelf wordt gekopieerd naar de nieuwe variabele, wat betekent dat we twee verschillende instanties van het object hebben, die elkaar niet kunnen beïnvloeden.
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'
}
}
Gebruikte referentietypen
Referentietypen bestaan uit zowel een verwijzing naar een geheugengebied als een waarde die binnen dat gebied is opgeslagen.
Dit is analoog aan verwijzingen in C / C ++.
Alle referentietypen worden opgeslagen op de zogenaamde heap .
De heap is gewoon een beheerd geheugengebied waar objecten worden opgeslagen. Wanneer een nieuw object wordt geïnstantieerd, wordt een deel van de heap toegewezen voor gebruik door dat object en wordt een verwijzing naar die locatie van de heap geretourneerd. De berg wordt beheerd en onderhouden door de vuilnisman en maakt geen handmatige tussenkomst mogelijk.
Naast de geheugenruimte die nodig is voor de instantie zelf, is extra ruimte vereist om de referentie zelf op te slaan, samen met aanvullende tijdelijke informatie vereist door de .NET CLR.
De onderstaande code toont een referentietype dat wordt toegewezen aan een nieuwe variabele. In dit geval gebruiken we een klasse, alle klassen zijn referentietypes (zelfs als ze statisch zijn).
Wanneer een verwijzingstype wordt toegewezen aan een andere variabele, is het de verwijzing naar het object dat wordt gekopieerd, niet de waarde zelf. Dit is een belangrijk onderscheid tussen waardetypen en referentietypen.
De implicaties hiervan zijn dat we nu twee verwijzingen naar hetzelfde object hebben.
Wijzigingen in de waarden binnen dat object worden weerspiegeld in beide variabelen.
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'
}