boxing et unboxing en int et string
Je suis peu confus dans boxing et unboxing. Selon sa définition
De boxe est de la conversion implicite de ValueTypes de Types de Référence (Objet).
UnBoxing est explicite conversion de Types de Référence (Objet) à son équivalent ValueTypes.
le meilleur exemple pour la description c'est
int i = 123; object o = i; //boxing
et
o = 123; i = (int)o; //unboxing
Mais ma question est si l'int est le type de la valeur et de la chaîne est le type de référence de sorte
int i = 123; string s = i.ToString();
et
s = "123"; i = (int)s;
Est-ce un exemple de boxing et unboxing ou pas???
s = "123"; i = (int)s;
ne compile paspourquoi le
OOP
tag? En effet, le C# est un langage OO, mais la question posée ne semble pas être liée à la Orienté Objet paradigme de programmationEh bien,
ToString
est une méthode virtuelle sur object
qui est alors remplacée par la Int32
type, il n'est donc votre (certes ténue) programmation orientée objet connexion.Maintenant, j'ai modifié le OPs tags
Des concepts complexes, qui se produit parce que le langage de programmation est en désordre, c'est pourquoi la programmation Fonctionnelle est mieux. J'aime le C#, mais j'ai toujours apprendre quelque chose de nouveau.
OriginalL'auteur Gaurav Agrawal | 2011-06-21
Vous devez vous connecter pour publier un commentaire.
Appel
ToString
n'est pas de la boxe. Il crée une nouvelle chaîne qui se trouve tout juste à contenir la représentation textuelle de vos int.Lors de l'appel de
(object)1
cela crée une nouvelle instance sur le segment qui contient un int. Mais c'est toujours uneint
. (Vous pouvez vérifier que aveco.GetType()
)Chaîne ne peut pas être convertie avec un casting de
int
. Si votre code ne compilera pas.Si vous lancez votre chaîne de
object
votre code compile mais ne parviennent pas au moment de l'exécution, depuis votre objet n'est boxed de type int. Vous ne pouvez unbox un type de valeur dans exactement le bon type(ou les associés nullable).Deux exemples:
Cassé:
De travail:
OriginalL'auteur CodesInChaos
C'est PAS de boxe. C'est tout simplement un appel de méthode à
Int32.ToString()
qui retourne une chaîne formatée, représentant la valeur de laint
.Ce code ne compile pas car il n'existe pas de conversion explicite définie entre
System.String
etSystem.Int32
.Pense de la façon suivante pour comprendre ce qui est et ce qui n'est pas boxe et unboxing:
Boxe: quand vous prenez un type de valeur et juste "coller" dans une variable de référence. Il n'y a pas besoin de tout type de conversion spécifiques logique pour cette opération de travail. Le type de variable sera toujours le même si vous utilisez
GetType()
.Unboxing: l'opération inverse. Prendre une valeur de type coincé dans un objet de référence et de l'affecter à une variable de type valeur. Il n'y a pas besoin de tout type de conversion spécifiques logique pour cette opération de travail.
Donc si
(int)s
étaient valides, il serait tout simplement une conversion explicite et pas un unboxing opération, parce ques.GetType()
serait de retourSystem.String
, pasSystem.Int32
.GetType
toujours boîtes, de sorte que le résultat deGetType
sur un nullable est le type sous-jacent alors quetypeof
vous donne le type nullable.OriginalL'auteur InBetween
Boxing/Unboxing: Conversion de Types de Valeur à l'objet de la représentation et vice-versa (par exemple de type int et de l'objet).
La méthode ToString (), en revanche, est une opération qui a généré une nouvelle chaîne, n'a rien à voir avec la boxe/fonte/type de conversation.
OriginalL'auteur codymanix
La fin de la partie, mais...... Je n'aime pas la simple lecture des réponses et sans preuves derrière eux. J'aime comprendre le problème et d'analyser les solutions possibles et de voir si il ya un lien avec ma compréhension. Ce copier et coller du texte à partir de la acclamée à juste titre excellent "CLR via C#" par le dieu Jeff Richter explique ceci:
Même si "unboxed" types de valeur n'ont pas d'objet de type pointeur, vous pouvez toujours appeler des méthodes virtuelles (comme d'égal à Égal, GetHashCode, ou ToString) hérité ou remplacé par le type. Si votre type de valeur remplace l'une de ces méthodes virtuelles, puis le CLR peut invoquer la méthode nonvirtually parce que les types de valeur sont implicitement scellé et ne peut pas tous les types de dérivés. En outre, le type de la valeur de l'instance utilisé pour invoquer la méthode virtuelle n'est pas en boîte. Toutefois, si votre remplacement de la méthode virtuelle d'appels dans le type de base de la mise en œuvre de la méthode, le type de la valeur de l'instance ne s'en boîte lors de l'appel de la base du type de mise en œuvre ainsi qu'une référence à un objet tas se passait à ce pointeur dans la méthode de base. Cependant, l'appel d'une nonvirtual méthode héritée (comme GetType ou MemberwiseClone) nécessite toujours le type de la valeur à être mis en boîte parce que ces méthodes sont définis par le Système.Objet, de sorte que les méthodes s'attendre à de la cet argument un pointeur qui se réfère à un objet sur le tas.
M. Richter devrait être donné une médaille pour ce livre. Si vous ne l'avez pas, l'obtenir!! Ensuite, vous aurez ça 🙂
this
paramètre. SimyStruct
ne remplace pasToString
, lethis
paramètre sera de typeObject
; si elle ne le remplacer, lethis
paramètre sera de typeref myStruct
. Le passage d'unmyStruct
variable d'un Objet de paramètre nécessite la boxe; de le transmettre comme unref MyStruct
paramètre ne fonctionne pas.OriginalL'auteur MrDev