![]() |
Boxing und Unboxing in C#
Hmm ich möchte hier nochmal anknüpfen. Und zwar habe ich grad etwas über Boxing und Unboxing in C# gelesen. Wie es funktioniert habe ich verstanden. Eine Integer Variable (Wertetyp) kann zu einem Object (Referenztyp) "konvertiert" werden.
Das würde in C# so aussehen:
Delphi-Quellcode:
Jetzt habe ich aus einer Wertetyp Variable eine Referenztyp Variable gemacht. Aber warum ? Ich seh den Vorteil nicht, kann es jemand Anhand eines Beispiels erklären?
int i = 321;
object o = i; //boxed Dankeschön :thumb: |
AW: Heap und Stack - Unterschiede
Das Einzige, was ich mir da vorstellen kann, daß man unterschiedliche Wert-Typen in der Objektvariable unterbringen kann. :gruebel:
Und am Ende könnte man über Typprüfungen unterscheiden was für Werte enthalten sind. quasi Currency, Integer, Int64, Float oder sonstwas. Vielleicht auch, um einen Wert irgendwo unterzubringen, wo sonst nur ein Objekt reinpaßt? Also das Umgekehrte, wie man im Delphi alles Mögliche in einen Integer/Pointer reincastet. |
AW: Heap und Stack - Unterschiede
Wenn man eine Referenz auf einen Integer braucht und nicht den Integer selbst.
Pointer gibbet in C# ja so nicht (unsafe ausgenommen) (dein Integer "wandert" also vom Stack in den Heap) |
AW: Heap und Stack - Unterschiede
Ich bin neu in der .NET Programmierung aber ich arbeite hin und wieder mit Delphi. Eine Referenz auf eine Variable hab ich bisher nie gebraucht deswegen die Frage: Warum bzw. wann braucht man sowas? Beispiel ?
|
AW: Heap und Stack - Unterschiede
Delphi-Quellcode:
Wenn es darauf ankommt, dass j IMMER den selben Wert hat wie i, dann brauchst du einen Zeiger.
var
i, j: integer; i := 5; j := i; i := 10; // i = 10, j = 5
Delphi-Quellcode:
Hinweis: hier (Delphi-Beispiel) wandert nichts in den Heap!
var
i: integer; j: ^integer; i := 5; j := @i; i := 10; // i = 10, j^ = 10 |
AW: Heap und Stack - Unterschiede
Hmm aber mein Code funktioniert doch so:
i wird als Integer deklariert und mit einer Zahl initialisiert. (i liegt auf dem Stack) o wird als Objekt deklariert. Ein neues Objekt wird auf dem Heap erstellt und der Inhalt von i wird in das Objekt kopiert. o liegt auf dem Stack und verweist auf das Objekt. Da es sich bei o um eine Referenz auf ein Objekt, welches eine Kopie von i ist, handelt, wird sich bei Änderung von i, o nicht verändern. Jedenfalls habe ich das so verstanden ... :?:
Delphi-Quellcode:
int i = 321;
object o = i; //boxed |
AW: Heap und Stack - Unterschiede
Der Sinn (oder zumindest ein großer Vorteil) ist, dass du mittels boxing eine generische Klasse/Funktion schreiben kannst, die wirklich alle Typen unterstützt.
Einer Funktion, die einen Object Parameter erwartet, kann also wirklich alles übergeben werden. Und diese kann dann auch auf ihren Parameter .toString() aufrufen, da diese Funktion ja in object deklariert ist. Eine List<int> und eine List<double> benutzen also die gleiche List<T> wie List<String> oder List<StringBuilder> Genaueres können dir bestimmt Phoenix oder Elvis erzählen, die kennen sich noch besser mit .net aus :-) |
AW: Heap und Stack - Unterschiede
Zitat:
Zitat:
Delphi-Quellcode:
int i = 0;
string s = i.ToString(); Zitat:
|
AW: Heap und Stack - Unterschiede
Ich habe mir das mit dem Boxing nicht so heftig/blöd vorgestellt.
![]() Sowas sollte man doch verbieten, oder? |
AW: Heap und Stack - Unterschiede
Zitat:
Es geht auch kürzer:
Code:
(5).ToString()
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz