Ricerca…


Osservazioni

Vale la pena notare che nel dichiarare un tipo di riferimento, il suo valore iniziale sarà null . Questo perché non punta ancora a una posizione in memoria, ed è uno stato perfettamente valido.
Tuttavia, con l'eccezione dei tipi nullable, i tipi di valore devono sempre avere sempre un valore.

Tipi di valore in uso

I tipi di valore contengono semplicemente un valore .

Tutti i tipi di valore derivano dalla classe System.ValueType e questo include la maggior parte dei tipi incorporati.

Quando si crea un nuovo tipo di valore, viene utilizzata un'area di memoria chiamata stack .
Lo stack crescerà di conseguenza, in base alla dimensione del tipo dichiarato. Ad esempio, ad un int verranno sempre assegnati 32 bit di memoria nello stack. Quando il tipo di valore non è più nell'ambito, lo spazio nello stack sarà deallocato.

Il codice seguente mostra un tipo di valore assegnato a una nuova variabile. Una struct viene utilizzata come un modo conveniente per creare un tipo di valore personalizzato (la classe System.ValueType non può essere estesa in altro modo).

La cosa importante da capire è che quando si assegna un tipo di valore, il valore stesso viene copiato nella nuova variabile, nel senso che abbiamo due istanze distinte dell'oggetto, che non possono influenzarsi a vicenda.

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

Tipi di riferimento in uso

I tipi di riferimento comprendono sia un riferimento a un'area di memoria, sia un valore memorizzato all'interno di quell'area.
Questo è analogo ai puntatori in C / C ++.

Tutti i tipi di riferimento sono memorizzati su ciò che è noto come heap .
L'heap è semplicemente un'area di memoria gestita in cui sono memorizzati gli oggetti. Quando un nuovo oggetto viene istanziato, una parte dell'heap verrà allocata per l'utilizzo da quell'oggetto e verrà restituito un riferimento a tale posizione dell'heap. L'heap è gestito e gestito dal garbage collector e non consente l'intervento manuale.

Oltre allo spazio di memoria richiesto per l'istanza stessa, è necessario ulteriore spazio per memorizzare il riferimento stesso, insieme a ulteriori informazioni temporanee richieste da .NET CLR.

Il codice seguente mostra un tipo di riferimento assegnato a una nuova variabile. In questo caso, stiamo usando una classe, tutte le classi sono tipi di riferimento (anche se statici).

Quando un tipo di riferimento è assegnato a un'altra variabile, è il riferimento all'oggetto che viene copiato, non il valore stesso. Questa è una distinzione importante tra tipi di valore e tipi di riferimento.

Le implicazioni di questo sono che ora abbiamo due riferimenti allo stesso oggetto.
Qualsiasi modifica ai valori all'interno di quell'oggetto sarà riflessa da entrambe le variabili.

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow