Entwickler-Ecke

Basistechnologien - In C# sind Datentypen ebenfalls Objekte. Macht das Sinn?


gitta - Di 26.07.05 16:28
Titel: In C# sind Datentypen ebenfalls Objekte. Macht das Sinn?
Hallo Zusammen,

ich habe etwas sehr wichtiges noch nicht kappiert:
Wenn ich in Delphi ein Integer verwende, werden 4Byte
Speicher verbraten. Wenn in C# nun ein Integer ein
Objekt ist mit jede Menge Methoden, wie viell Speicher wird
dafür verwendet?
Oder ist es so zu verstehen das der Compiler so Inteligent
ist, das alle Methoden u.s.w. eines jeden Objektes entfernt werden
wenn diese in der Anwendung keine Verwendung finden.?

Gruß Gitta


Moderiert von user profile iconraziel: Topic aus .NET verschoben am Sa 17.09.2005 um 22:11


uall@ogc - Di 26.07.05 17:45

ich meine in java ist es das selbe, es macht nen unterschied ob man einen integer oder einen int hat

integer = zahl
int = objekt

wie der compiler das aber optimiert kann ich dir nicht sagen


UC-Chewie - Di 26.07.05 17:57

Bei .NET gibt es keine primitiven Typen wie bei Java, auch der simpelste Integer ist ein Objekt.

Aber: Der Compiler erkennt die Fälle, in denen keine Methoden der Objekte verwendet werden. In diesem Fall werden die Variablen als primitive Typen behandelt, es entsteht also kein Overhead. Erst wenn diese Variablen wirklich als Objekte verwendet werden, werden sie auch als Objekte behandelt und auf dem Heap abgelegt.


Das habe ich zumindest mal gelesen, bin mir aber nicht mehr sicher, wo, deshalb ist das ganze ohne Gewähr.


Motzi - Di 26.07.05 18:09

Es ist ungefähr so wie UC-Chewie das schon erklärt hat.. Das ganze nennt sich Boxing bzw Unboxing. Eine Boxingkonvertierung ermöglicht die implizite Konvertierung eines Werttyps in einen Verweistyp. Folgende Boxingkonvertierungen gibt es:

Das Boxing des Wertes eines Werttyps besteht aus dem Anlegen einer Objektinstanz und dem Kopieren des Werts des Werttyps in diese Instanz.
Eine Unboxingkonvertierung ermöglicht die explizite Konvertierung eines Verweistyps in einen Werttyp. Folgende Unboxingkonvertierungen gibt es:

Bei einer Unboxingoperation wird zuerst überprüft, ob die Objektinstanz ein mittels Boxing gepackter Wert des Werttyps ist, und anschließend wird der Wert aus der Instanz kopiert.

Gruß, Motzi


gitta - Mi 27.07.05 10:22

Hallo Motzi,

danke für die ausführliche Antwort.
Das Boxing-/UnBoxing passiert das automatisch oder muss ich selbst machen?
Wenn von Hand, wie sieht das aus? Kannst Du mir bitte ein Beispiel
geben?

Danke schon mal.

Gruß Gitta


Marauder - Mi 17.08.05 01:50

hä?

Leutz!

Alle ordinalen und andere Datentypen in .net sind Objekte. ALLE!
Darum kümmert sich die CTS (Common Type System).

Es gibt Valuetypes (Wertetypen) und Referencetypes (Referenztypen)

Referencetypes (Objekte) werden im Heap gespeichert, weil deren Größe sich ändern kann.
Valuetypes in einer eigenen Datenstruktur, weil Sie eine feste Größe haben.
(allocated inline structure)
Aus Gründen der Effinzienz und Geschwindigkeit werden Valuetype-Objekte anders behandelt
als normale Objekte. Wenn ValueTypes intern als "normale" Objekte gespeichert werden müssen, zum Beispiel
wenn eine Collection einen System.Object benötigt, kommt das Boxing zum Einsatz.
Zum Boxing wird ein gewisser Speicherbereich im Heap reserviert und das komplette Teil wird dorthin
kopiert und gilt fortan als normales Objekt.

Wenn das ganze umgekehrt abläuft nenn man das unboxing.


Marauder - Mi 17.08.05 22:46

Boxing kann implizit oder explizit erfolgen:

Implizit in Delphi:

Delphi-Quelltext
1:
2:
collection.object := a   // a stellt eine Variable vom ordinalen 
                         // Typ Integer dar

Müsste in C# gleich sein.

Explizit in Delphi:

Delphi-Quelltext
1:
oObject := System.Object (a) // a wieder Ordinaltyp Integer                    

umgekehrt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var oObject : tObject;
    bBool   : Boolean;

bBool := True;
oObject := bBool;

x := Boolean (oObject) // unboxing