Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Boxing und Unboxing in C# (https://www.delphipraxis.net/162513-boxing-und-unboxing-c.html)

-187- 25. Aug 2011 17:15

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:
            int i = 321;
            object o = i; //boxed
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?

Dankeschön :thumb:

himitsu 25. Aug 2011 17:38

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.

SebE 25. Aug 2011 17:52

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)

-187- 25. Aug 2011 17:55

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 ?

SebE 25. Aug 2011 17:58

AW: Heap und Stack - Unterschiede
 
Delphi-Quellcode:
var
  i, j: integer;

i := 5;
j := i;
i := 10;

// i = 10, j = 5
Wenn es darauf ankommt, dass j IMMER den selben Wert hat wie i, dann brauchst du einen Zeiger.

Delphi-Quellcode:
var
  i: integer;
  j: ^integer;

i := 5;
j := @i;
i := 10;

// i = 10, j^ = 10
Hinweis: hier (Delphi-Beispiel) wandert nichts in den Heap!

-187- 25. Aug 2011 18:20

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

jfheins 25. Aug 2011 18:41

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 :-)

-187- 25. Aug 2011 18:45

AW: Heap und Stack - Unterschiede
 
Zitat:

Zitat von jfheins (Beitrag 1119665)
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.

Okay das macht schonmal Sinn :thumb:

Zitat:

Zitat von jfheins (Beitrag 1119665)
Und diese kann dann auch auf ihren Parameter .toString() aufrufen, da diese Funktion ja in object deklariert ist.

Ich kann auch wie folgt zugreifen:

Delphi-Quellcode:
int i = 0;
string s = i.ToString();

Zitat:

Zitat von jfheins (Beitrag 1119665)
Eine List<int> und eine List<double> benutzen also die gleiche List<T> wie List<String> oder List<StringBuilder>

Das hab ich nicht verstanden ? :pale:

SebE 25. Aug 2011 18:49

AW: Heap und Stack - Unterschiede
 
Ich habe mir das mit dem Boxing nicht so heftig/blöd vorgestellt.

http://social.msdn.microsoft.com/For...-1072384266dd/
Sowas sollte man doch verbieten, oder?

SebE 25. Aug 2011 18:53

AW: Heap und Stack - Unterschiede
 
Zitat:

Zitat von -187- (Beitrag 1119667)
Ich kann auch wie folgt zugreifen:

Delphi-Quellcode:
int i = 0;
string s = i.ToString();

Ich denke hier wird implizit das Boxing angewandt.
Es geht auch kürzer:
Code:
(5).ToString()


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz