Klassen sind Referenztypen und Strukturen sind Wertetypen.
Wenn ich sage, dass Klassen Referenztypen sind,
enthalten sie im Grunde 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 kann
ich eine Instanz dieser Klasse mit einem neuen Operator erstellen, der Speicher für diese Klasse
zuweist und deren Basisadresse in der Variablen vom Typ MyClass (_myClassObject2) speichert.
Static Public void Main (string[] arg)
{
MyClass _myClassObject1 = new MyClass();
_myClassObject1.DataMember = 10;
MyClass _myClassObject2 = _myClassObject1;
_myClassObject2.DataMember=20;
}
Im obigen Programm ist MyClass _myClassObject2 = _myClassObject1; Anweisung gibt an, dass beide Variablen vom Typ MyClass sind
- myClassObject1
- myClassObject2
und zeigt auf denselben Speicherort.
Grundsätzlich wird derselbe Speicherort einer anderen Variablen des gleichen Typs zugewiesen.
Wenn also Änderungen, die wir an einem der Objekttypen MyClass vornehmen, Auswirkungen auf einen anderen haben, zeigen
beide auf denselben Speicherort.
"_myClassObject1.DataMember = 10;" In dieser Zeile enthalten beide Datenelemente des Objekts den Wert 10.
"_myClassObject2.DataMember = 20;" In dieser Zeile enthält das Datenelement des Objekts den Wert 20.
Schließlich greifen wir ü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 wird
das Objekt vom Typ MyStructure mithilfe eines neuen Operators instanziiert und die
Adresse in der Variablen _myStructObject vom Typ MyStructure und gespeichert
dem Datenelement der Struktur mit "_myStructObject1.DataMember = 10" der Wert 10 zugewiesen.
In der nächsten Zeile
deklariere ich eine andere Variable _myStructObject2 vom Typ MyStructure und weise ihr _myStructObject1 zu.
Hier erstellt der .NET C # -Compiler eine weitere Kopie des Objekts _myStructureObject1 und
weist diesen Speicherort der MyStructure-Variablen _myStructObject2 zu.
Was auch immer wir an _myStructObject1 ändern, wird sich niemals auf eine andere Variable _myStructObject2 vom Typ MyStructrue auswirken.
Deshalb sagen wir, dass Strukturen Werttypen sind.
Die unmittelbare Basisklasse für die Klasse ist also Object und die unmittelbare Basisklasse für Structure ist ValueType, das von Object erbt.
Klassen unterstützen eine Vererbung, Strukturen dagegen nicht.
Wie sagen wir das?
Und was ist der Grund dafür?
Die Antwort lautet Klassen.
Es kann abstrakt, versiegelt, statisch und teilweise sein und kann nicht privat, geschützt und intern geschützt sein.