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
raziel: 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:
- Aus jedem Werttyp (einschließlich aller Enumerationstypen) in den Typ object
- Aus jedem Werttyp (einschließlich aller Enumerationstypen) in den Typ System.ValueType
- Aus jedem Werttyp in jeden Schnittstellentyp, der durch den Wert implementiert wird.
- Aus jedem Enumerationstyp in den Typ System.Enum
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:
- Aus dem Typ object in jeden Werttyp (einschließlich aller Enumerationstypen)
- Aus dem Typ System.ValueType in jeden Werttyp (einschließlich aller Enumerationstypen)
- Aus jedem Schnittstellentyp in jeden Werttyp, der den Schnittstellentyp implementiert.
- Aus dem Typ System.Enum in jeden Enumerationstyp.
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 |
Müsste in C# gleich sein.
Explizit in Delphi:
Delphi-Quelltext
1:
| oObject := System.Object (a) |
umgekehrt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var oObject : tObject; bBool : Boolean;
bBool := True; oObject := bBool;
x := Boolean (oObject) |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!