x.toString()和x +""之间的区别

182*_*216 3 c# java

回到大学我的一个教授.教我们只是做x + ""一个从基本类型到字符串的快速转换.
我不记得是什么课程,因为我有一些Java和C++课程(我现在还没有使用过一段时间),但我现在在C#/ .Net中使用它,这就是我主要开发的内容在最近.

在int,decimal,float等基本类型上使用.toString()over 是否有优势+""?什么情况会.toString()更好?

注意:我也被展示.toString()了,那个教授刚刚推荐,+""因为它更短,我从那时起就完成了,而没有质疑它.

Zac*_*h L 14

好吧,作为旁注,它取决于x是什么.如果x是Java中的原语,则必须.toString()使用其中一个包装器调用,例如

Integer.toString(x)

我会说使用toString()通常更好,因为至少在Java中,x +""表示你想要将两个字符串附加在一起.

就像在这个例子中:

 public static void main(String[] args)
 {
   int x = 3;
   String s = x + "";   
 }
Run Code Online (Sandbox Code Playgroud)

最终,在字节码中,如下:

public static void main(java.lang.String[]);
  Code:
   0:   iconst_3
   1:   istore_1
   2:   new #2; //class java/lang/StringBuilder
   5:   dup
   6:   invokespecial   #3; //Method java/lang/StringBuilder."<init>":()V
   9:   iload_1
   10:  invokevirtual   #4; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
   13:  ldc #5; //String 
   15:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   18:  invokevirtual   #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   21:  astore_2
   22:  return
Run Code Online (Sandbox Code Playgroud)

所以它必须创建一个StringBuilder来追加""和x的String值.虽然效率损失不是那么多,但使用toString函数并不算太多.

与使用toString比较:

 public static void main(String[] args)
 {
   int x = 3;
   String s = Integer.toString(x); 
 }
Run Code Online (Sandbox Code Playgroud)

最终结果如下:

public static void main(java.lang.String[]);
Code:
 0: iconst_3
 1: istore_1
 2: iload_1
 3: invokestatic    #2; //Method java/lang/Integer.toString:(I)Ljava/lang/String;
 6: astore_2
 7: return
Run Code Online (Sandbox Code Playgroud)

虽然它可能只是我的意见,但使用.toString反映了你真正想要的东西 - 你想要x的字符串值,而使用x +""是一种破解并且说 - 我希望x的字符串值连接起来用"".

旁注:我不能谈论C#会发出的中间字节码,但我想象一下类似的东西.另外,使用C#,您可以像引用类型一样轻松地调用值类型的.ToString(),所以我认为我的建议也适用.

  • C#编译器识别空字符串并将其优化掉.它最终调用`string.Concat(object)`,它反过来相当于`arg == null?"":arg.ToString()`. (2认同)