0
votes

Pourquoi la boxe se produit-elle dans l'expression d'interpolation de l'int?

Par exemple, le code suivant: xxx pré>

mais après l'ajout tostring () code> explicitement, la boxe ne se produira pas. P>

int n=1;
//The compiler will recommend removing the explicit call of the ToString() method
string str=$"{n.ToString()}";


1 commentaires

Connexes: 1 , 2 < / a>, 3 .


3 Réponses :


1
votes

"appelant tostring " n'est pas une façon magique d'empêcher la boxe. La boxe arrive toujours si vous appelez tostring après il a été en boîte, ce qui est le cas avec une interpolation de chaîne.

Comme vous le savez, des interpolations de chaîne dedans de descente à string.format appels. Si vous regardez le Liste des surcharges Disponible , vous verrez qu'il n'y a pas de surcharge qui prend un type de valeur comme int ou long . Chaque surcharge prend un objet . Pour réussir un int dans ces méthodes, il doit d'abord être en boîte. string.format appelle ensuite tostring à un point dans l'objet Boxed . .

Comparez ceci pour appeler directement Tostring dans l'interpolation de chaîne. Il n'y a pas de conversion à un type de référence ( objet ), donc pas de boxe.


2 commentaires

Merci ~ Je sais que String.Format n'a pas de surcharge de Int, mais lorsque j'utilise explicitement une totring, le compilateur recommande de supprimer la méthode de totrage. Est-ce un problème avec le compilateur?


@yuxing non. Vous ne devriez pas toujours utiliser le code le plus performant au coût de la lisibilité. Vous ne devriez essayer que d'optimiser où vous en avez vraiment besoin. Où vous n'en avez pas vraiment besoin, cherchez-vous à la lisibilité.



2
votes

Je note que malgré le fait que votre code utilise une chaîne interpolée C #, il n'utilise pas la classe formatée car le compilateur C # n'utilisera que formatée si La chaîne interpolée est directement affectée à un formatée -Typed variable, champ ou paramètre (que je suis en désaccord avec, mais de toute façon).

Le livre CLR via C # écrit cette chaîne.Format appellera la méthode de totring en interne pour obtenir la représentation de chaîne de l'objet.

oui, mais tout le string.format surcharge utilise les paramètres -type ou objet paramètres [] , lequel signifie nécessairement la boxe de ses arguments.

Pourquoi la boxe se produit-elle dans l'exemple 1?

parce qu'il doit passer int n dans objet arg0 .

Voici l'IL qui est généré quand je compile votre premier Bloc de code dans Linqpad (C # 8.0, avec optimisations de compilateur activé): xxx

Vous pouvez voir la zone instruction à l'instruction offset iL_0008 , juste avant de le transmettre dans string.format .


0 commentaires

-1
votes

Pour formater une chaîne, il ne peut que prendre des types d'objet, auxquels il appelle la touche () de sorte qu'il puisse la concaténer. La boxe tournait essentiellement une valeur de valeur en un type de référence, ce qui se passe dans la coulée implicite à l'objet, de sorte qu'il peut être stocké dans le tas.


0 commentaires