Suche…


Bemerkungen

Es ist erwähnenswert, dass bei der Deklaration eines Referenztyps der Anfangswert null . Dies liegt daran, dass es noch nicht auf einen Speicherort im Speicher verweist und ein einwandfreier Zustand ist.
Mit Ausnahme von nullfähigen Typen müssen Wertetypen jedoch normalerweise immer einen Wert haben.

Verwendete Werttypen

Werttypen enthalten einfach einen Wert .

Alle Werttypen werden von der System.ValueType- Klasse abgeleitet. Dazu gehören die meisten integrierten Typen.

Beim Erstellen eines neuen Werttyps wird der als Stack bezeichnete Speicherbereich verwendet.
Der Stack wächst entsprechend um den deklarierten Typ. So wird zum Beispiel einem int immer 32 Bit Speicher auf dem Stack zugewiesen. Wenn der Werttyp nicht mehr im Gültigkeitsbereich liegt, wird der Speicherplatz auf dem Stapel freigegeben.

Der folgende Code veranschaulicht einen Werttyp, der einer neuen Variablen zugewiesen wird. Eine Struktur wird als praktische Methode zum Erstellen eines benutzerdefinierten Werttyps verwendet (die System.ValueType-Klasse kann nicht anderweitig erweitert werden).

Es ist wichtig zu verstehen, dass bei der Zuweisung eines Werttyps der Wert selbst in die neue Variable kopiert wird, was bedeutet, dass wir zwei verschiedene Instanzen des Objekts haben, die sich nicht gegenseitig beeinflussen können.

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

Verwendete Referenztypen

Referenztypen umfassen sowohl einen Verweis auf einen Speicherbereich als auch einen in diesem Bereich gespeicherten Wert .
Dies ist analog zu Zeigern in C / C ++.

Alle Referenztypen werden auf dem sogenannten Heap gespeichert.
Der Heap ist einfach ein verwalteter Speicherbereich, in dem Objekte gespeichert werden. Wenn ein neues Objekt instanziiert wird, wird ein Teil des Heaps für die Verwendung durch dieses Objekt zugewiesen und ein Verweis auf diese Position des Heaps wird zurückgegeben. Der Heap wird vom Garbage Collector verwaltet und gewartet und erlaubt keinen manuellen Eingriff.

Zusätzlich zu dem für die Instanz selbst erforderlichen Speicherplatz ist zusätzlicher Speicherplatz zum Speichern der Referenz selbst sowie zusätzliche temporäre Informationen erforderlich, die für die .NET CLR erforderlich sind.

Der folgende Code veranschaulicht, wie ein Referenztyp einer neuen Variablen zugewiesen wird. In diesem Fall verwenden wir eine Klasse. Alle Klassen sind Referenztypen (auch wenn sie statisch sind).

Wenn ein Referenztyp einer anderen Variablen zugewiesen wird, ist es die Referenz auf das Objekt, die kopiert wird, nicht der Wert selbst. Dies ist ein wichtiger Unterschied zwischen Werttypen und Referenztypen.

Dies hat zur Folge, dass wir jetzt zwei Verweise auf dasselbe Objekt haben.
Alle Änderungen an den Werten innerhalb dieses Objekts werden von beiden Variablen übernommen.

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow