Par exemple, le code suivant: 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()}";
3 Réponses :
"appelant Comme vous le savez, des interpolations de chaîne dedans de descente à Comparez ceci pour appeler directement tostring code>" n'est pas une façon magique d'empêcher la boxe. La boxe arrive toujours si vous appelez
tostring code> après em> il a été en boîte, ce qui est le cas avec une interpolation de chaîne. P>
string.format code> 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 code> ou
long code>. Chaque surcharge prend un objet
code>. Pour réussir un
int code> dans ces méthodes, il doit d'abord être en boîte.
string.format code> appelle ensuite
tostring code> à un point dans l'objet code> Boxed code> p>. P>.
Tostring code> dans l'interpolation de chaîne. Il n'y a pas de conversion à un type de référence (
objet code>), donc pas de boxe. P>
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é.
Je note que malgré le fait que votre code utilise une chaîne interpolée C #, il n'utilise pas la classe code> formatée code> car le compilateur C # n'utilisera que 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. P>
blockQuote> oui, mais tout le Pourquoi la boxe se produit-elle dans l'exemple 1? P>
blockquote> parce qu'il doit passer 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é): p> Vous pouvez voir la zone code> instruction code> à l'instruction offset formatée code> si La chaîne interpolée est directement affectée à un
formatée code> -Typed variable, champ ou paramètre (que je suis en désaccord avec, mais de toute façon).
string.format code> surcharge utilise les paramètres code>-type ou
objet paramètres [] code>, lequel signifie nécessairement la boxe de ses arguments. P>
int n code> dans
objet arg0 code>. p>
iL_0008 code>, juste avant de le transmettre dans
string.format code>. p> p>
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. P>
Connexes: 1 , 2 < / a>, 3 .