Recherche…


Remarques

Il convient de noter que lors de la déclaration d'un type de référence, sa valeur initiale sera null . En effet, il ne pointe pas encore vers un emplacement en mémoire et constitue un état parfaitement valide.
Cependant, à l'exception des types nullables, les types de valeur doivent généralement toujours avoir une valeur.

Types de valeur utilisés

Les types de valeur contiennent simplement une valeur .

Tous les types de valeur sont dérivés de la classe System.ValueType , et cela inclut la plupart des types intégrés.

Lors de la création d'un nouveau type de valeur, la zone de mémoire appelée la pile est utilisée.
La pile augmentera en conséquence, de la taille du type déclaré. Ainsi, par exemple, un int contient toujours 32 bits de mémoire sur la pile. Lorsque le type de valeur n'est plus dans la portée, l'espace sur la pile sera libéré.

Le code ci-dessous illustre un type de valeur affecté à une nouvelle variable. Une structure est utilisée comme un moyen pratique de créer un type de valeur personnalisé (la classe System.ValueType ne peut pas être étendue autrement).

La chose importante à comprendre est que lors de l’attribution d’un type valeur, la valeur elle-même est copiée dans la nouvelle variable, ce qui signifie que nous avons deux instances distinctes de l’objet, qui ne peuvent pas s’affecter.

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

Types de référence utilisés

Les types de référence comprennent à la fois une référence à une zone de mémoire et une valeur stockée dans cette zone.
Ceci est analogue aux pointeurs en C / C ++.

Tous les types de référence sont stockés sur ce que l'on appelle le tas .
Le tas est simplement une zone de mémoire gérée où les objets sont stockés. Lorsqu'un nouvel objet est instancié, une partie du tas sera allouée pour être utilisée par cet objet et une référence à cet emplacement du segment sera renvoyée. Le tas est géré et géré par le garbage collector et ne permet pas une intervention manuelle.

Outre l'espace mémoire requis pour l'instance elle-même, de l'espace supplémentaire est nécessaire pour stocker la référence elle-même, ainsi que des informations temporaires supplémentaires requises par le CLR .NET.

Le code ci-dessous illustre un type de référence affecté à une nouvelle variable. Dans ce cas, nous utilisons une classe, toutes les classes sont des types de référence (même si elles sont statiques).

Lorsqu'un type de référence est affecté à une autre variable, il s'agit de la référence à l'objet copié et non de la valeur elle-même. Ceci est une distinction importante entre les types de valeur et les types de référence.

Cela implique que nous avons maintenant deux références au même objet.
Toute modification des valeurs dans cet objet sera reflétée par les deux variables.

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow