Klassen sind Referenztypen und Strukturen sind Wertetypen.
Wenn ich sage, dass Klassen Referenztypen sind,
Grundsätzlich enthalten sie die Adresse einer Instanzvariablen.
Zum Beispiel:
Class MyClass
{
Public Int DataMember; //By default, accessibility of class data members
//will be private. So I am making it as Public which
//can be accessed outside of the class.
}
In der Hauptmethode,
Ich kann eine Instanz dieser Klasse erstellen, indem ich den Operator new verwende, der Speicher für diese Klasse zuweist
und speichert die Basisadresse davon in der Variablen vom Typ MyClass (_myClassObject2).
Static Public void Main (string[] arg)
{
MyClass _myClassObject1 = new MyClass();
_myClassObject1.DataMember = 10;
MyClass _myClassObject2 = _myClassObject1;
_myClassObject2.DataMember=20;
}
Im obigen Programm, MyClass _myClassObject2 = _myClassObject1; Anweisung zeigt an, dass beide Variablen vom Typ MyClass
- myClassObject1
- myClassObject2
und verweist auf denselben Speicherplatz.
Sie weist im Grunde denselben Speicherplatz einer anderen Variablen desselben Typs zu.
Wenn wir also Änderungen an einem der Objekte vom Typ MyClass vornehmen, wirkt sich das auf ein anderes Objekt aus.
da beide auf denselben Speicherplatz verweisen.
"_myClassObject1.DataMember = 10;" in dieser Zeile werden die beiden Datenelemente des Objekts den Wert 10 enthalten.
"_myClassObject2.DataMember = 20;" in dieser Zeile werden beide Datenelemente des Objekts den Wert 20 enthalten.
Irgendwann, wir greifen über Zeiger auf Datenelemente eines Objekts zu.
Im Gegensatz zu Klassen sind Strukturen Werttypen. Zum Beispiel:
Structure MyStructure
{
Public Int DataMember; //By default, accessibility of Structure data
//members will be private. So I am making it as
//Public which can be accessed out side of the structure.
}
Static Public void Main (string[] arg)
{
MyStructure _myStructObject1 = new MyStructure();
_myStructObject1.DataMember = 10;
MyStructure _myStructObject2 = _myStructObject1;
_myStructObject2.DataMember = 20;
}
Im obigen Programm,
Instanziierung des Objekts vom Typ MyStructure mit dem Operator new und
Speichern der Adresse in der Variablen _myStructObject vom Typ MyStructure und
Zuweisung des Wertes 10 zum Datenelement der Struktur mit "_myStructObject1.DataMember = 10".
In der nächsten Zeile,
Ich deklariere eine weitere Variable _myStructObject2 vom Typ MyStructure und weise _myStructObject1 dieser Variable zu.
Hier erstellt der .NET-C#-Compiler eine weitere Kopie des Objekts _myStructureObject1 und
weist diese Speicherstelle der MyStructure-Variablen _myStructObject2 zu.
Jede Änderung, die wir an _myStructObject1 vornehmen, wird sich also niemals auf eine andere Variable _myStructObject2 vom Typ MyStructrue auswirken.
Deshalb sagen wir, dass Strukturen Werttypen sind.
Die unmittelbare Basisklasse für Klasse ist also Object und die unmittelbare Basisklasse für Struktur ist ValueType, die von Object erbt.
Klassen unterstützen eine Vererbung, während Strukturen dies nicht tun.
Wie können wir das sagen?
Und was ist der Grund dafür?
Die Antwort lautet "Klassen".
Es kann abstrakt, versiegelt, statisch und partiell sein, aber nicht privat, geschützt und intern geschützt.