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

标签 c# java

回到大学时,我的一位教授。教我们只做 x + "" 作为从基本类型到字符串的快速转换。
我不记得它在哪个类(class),我让他参加了一些 Java 和 C++ 类(class)(我已经有一段时间没用过了),但我现在在 C#/.Net 中使用它,这是我主要开发的最近。

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

注意:我也看到了 .toString(),那个教授刚刚推荐了 +"" 因为它更短,从那时起我就这样做了,没有质疑

最佳答案

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

Integer.toString(x)

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

就像这个例子:

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

在字节码中,结果是:

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

所以它必须创建一个 StringBuilder 来将 ""和 x 的字符串值附加在一起。虽然效率损失并不大,但仅使用 toString 函数并不过分。

与使用 toString 比较:

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

结果如下:

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

虽然这可能只是我的意见,但使用 .toString 反射(reflect)了您真正想要的 - 您想要 x 的字符串值,而使用 x + ""有点乱七八糟,并且说 - 我想要字符串值x 与“”连接。

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

关于c# - x.toString() 和 x +""之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4730142/

相关文章:

c# - Invoke and Delegates in events - 为什么 Action 会以这种(意外的)顺序发生?

java - 将一种方法拆分为多种方法 - Java Chess

java - Hibernate 映射 1 到多

java - Horizo​​ntalScrollView从服务器获取数据

java - 无法加载CSS文件Java Spring

c# - DispatcherTimer 在 Win 2k8 SP2 中的 Stop() 后继续触发

c# - 如何更改 XML 父标签

c# - X509Certificate2.FriendlyName 属性无法检索 Linux 上的证书标签

c# - 如何在 ASP.NET C# 中触发 OnChange 类型的事件

java - 为什么 JFrame 不居中?