boxing und unboxing in int und string
Bin ich etwas verwirrt in boxing und unboxing. Nach seiner definition
Boxing ist eine implizite Konvertierung von ValueTypes Referenz-Typen (Objekt).
UnBoxing ist die explizite Konvertierung von Referenztypen (Objekte) zu seinem äquivalent ValueTypes.
das beste Beispiel für die Beschreibung dieser ist
int i = 123; object o = i; //boxing
und
o = 123; i = (int)o; //unboxing
Aber meine Frage ist, ob int-Wert eingeben und string ist Referenztyp so
int i = 123; string s = i.ToString();
und
s = "123"; i = (int)s;
Ist dies ein Beispiel für boxing und unboxing oder nicht???
s = "123"; i = (int)s;
nicht kompilieren- warum die
OOP
tag? Ja C# ist eine OO-Sprache, aber die Frage gebeten, nicht zu sein scheinen mit der Objekt-Orientierte Programmier-Paradigma - Gut,
ToString
ist eine virtuelle Methode aufobject
was ist dann außer Kraft gesetzt, durch dieInt32
geben, so ist Ihre (zugegebenermaßen dürftige) OOP-Verbindung. - Ich habe jetzt geändert auf die OPs-tags
- Komplexe Konzepte, die das passiert weil der Programmiersprache unordentlich ist, warum Funktionale Programmierung besser ist. Ich mag C#, aber ich Lerne immer etwas neues.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aufrufen
ToString
ist nicht Boxen. Es erstellt eine neue Zeichenfolge, die nur zufällig enthalten die textuelle Darstellung des int.Beim Aufruf
(object)1
dies erstellt eine neue Instanz auf dem heap enthält ein int. Aber es ist immer noch einint
. (Sie können überprüfen, dass mito.GetType()
)String nicht umgewandelt werden kann, mit einer Besetzung, zu
int
. So wird sich der code nicht kompilieren.Wenn du zuerst werfen Sie Ihre Zeichenfolge zu
object
Ihr code wird kompiliert, sondern zur Laufzeit scheitern, da das Objekt wird ohne Originalverpackung int. Sie nur unbox-Wert geben Sie in der exakt richtigen Typ(oder die zugehörige null-Werte zulässt).Zwei Beispiele:
Gebrochen:
Arbeiten:
Dies ist NICHT Boxen. Das ist einfach eine Methode aufrufen, um
Int32.ToString()
das gibt einen formatierten string, der den Wert derint
.Dieser code wird nicht kompilieren, da es keine explizite Konvertierung definiert zwischen
System.String
undSystem.Int32
.Denke, dass es in der folgenden Art und Weise zu verstehen, was ist und was nicht Boxen und unboxing:
Boxen: es ist, wenn Sie nehmen einen Wert geben und nur "kleben" Sie es in eine Referenz-variable. Es gibt keine Notwendigkeit, jede Art bestimmte conversion-Logik für diese operation zu arbeiten. Die variable Art wird immer noch die gleiche, wenn Sie
GetType()
.Unboxing: es ist nur die entgegengesetzte operation. Der Wert " geben Sie steckte in einem Referenz-Objekt, und weisen Sie einen Wert-Typ-Variablen. Wieder gibt es keine Notwendigkeit für jede Art bestimmte conversion-Logik für diese operation zu arbeiten.
Also, wenn
(int)s
gültig waren, wäre es einfach eine explizite Konvertierung und nicht ein unboxing Betrieb, weils.GetType()
zurückkehren würdeSystem.String
, nichtSystem.Int32
.GetType
immer Boxen, so das Ergebnis derGetType
auf ein normales null-Werte zulässt, ist den zugrunde liegenden Typ in der Erwägung, dasstypeof
gibt Ihnen die nullable-Typ.Boxing/Unboxing: Konvertierung von Werttypen zum Objekt Darstellung und Umgekehrt (z.B. int und Objekt).
Die ToString () - Methode im Gegensatz dazu ist eine operation, erzeugt einen neuen string, hat nichts zu tun mit Boxen/cast/Art Gespräch.
Spät, um die Partei auf diese, aber...... Ich weiß nicht, wie einfach Lesen, Antworten und ohne Beweise hinter Ihnen. Ich mag, um das problem zu verstehen und zu analysieren, die mögliche Lösung und sehen, ob es in Einklang mit meinem Verständnis. Dieses kopieren-und-einfügen von text aus der zu Recht gefeierten ausgezeichnete "CLR via C#" von Gott Jeff Richter erklärt dies:
Obwohl ohne Verpackung Wert-Typen haben keinen Typ Objektzeiger ist, können Sie immer noch als virtuelle Methoden (z.B. Equals, GetHashCode, oder ToString) vererbt oder überschrieben durch die Typ. Wenn Ihr Wert geben überschreibt man diese mit virtuellen Methoden, dann die CLR kann die Methode aufrufen nonvirtually, weil Werttypen werden implizit versiegelt und können nicht haben alle Arten von Ihnen abgeleitet. Darüber hinaus wird der Wert der Typ-Instanz verwendet zum aufrufen der virtuellen Methode ist nicht boxed. Allerdings, wenn Ihr überschreiben der virtuellen Methode ruft in die base geben Sie die Implementierung der Methode, dann wird der Wert der Typ-Instanz erhält, boxed beim aufrufen der Basis-Art der Umsetzung, so dass eine Referenz auf ein heap-Objekt übergeben bekommen, um den this-Zeiger in die Basis-Methode. Jedoch, ruft eine nicht virtuelle geerbte Methode (wie GetType oder MemberwiseClone) erfordert immer den Wert Typ zu sein, boxed, weil diese Methoden definiert sind, die durch das System.Objekt, so werden die Methoden erwarten, die dieses argument als ein Zeiger verweist auf ein Objekt auf dem heap.
Herr Richter gegeben werden sollte, eine Medaille für dieses Buch. Wenn du Sie noch nicht hast, besorge es dir!! Dann bekommst du es 🙂
this
parameter. WennmyStruct
nicht überschreibenToString
, diethis
parameter wird der TypObject
; wenn es nicht außer Kraft setzen, diethis
parameter wird der Typref myStruct
. Die übergabe einesmyStruct
variable ein Objekt` - parameter erfordert Boxen; indem er als einref MyStruct
parameter nicht.