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

时间:2011-01-18 23:13:23

标签: c# java

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

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

注意:我也看到了.toString(),教授刚才推荐+"",因为它更短,我从那时起就完成了这项工作而没有质疑。

8 个答案:

答案 0 :(得分:14)

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

Integer.toString(x)

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

就像这个例子一样:

 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的String值。虽然效率损失不是那么多,但仅使用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反映了你真正想要的东西 - 你想要x的String值,而使用x +“”是一种破解并说 - 我想要String值x与“”连接。

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

答案 1 :(得分:3)

老实说,我认为这种奇怪的建议。

我无法对每个特定情况说话,但一般情况下x + ""将在C#中做什么(这应该取决于{{1}类型的重载+运算符的存在}}或x)调用类似string的内容,无论如何都会调用string.Concat(x, "")

在典型情况下,这只意味着x.ToStringx + ""有更多方法调用的开销。但是,当x.ToString是某个值类型的变量时,这也会导致x的值被加框,除非x的重载专门针对{{1}的类型而存在(这可能被认为是无用的点,因为如果+的类型没有覆盖该方法,xx的调用中加框;这让我感到震惊aa 稀少,但最确定的确发生了。)

当然,这些是相当微不足道的差异。这两种方法之间的真正的区别在于可读性;根据我的经验,ToString在.NET中不是很惯用,所以我倾向于避免它。也就是说,它可能只是在我所居住的.NET世界中并不常见,而可能有很多.NET开发人员在那里做这件事。

指出,在Java中,也许您必须在C#中为x + ""等原始类型的变量Integer.toString(x)编写笨拙的x在.NET中,所有类型(包括所谓的“原始”类型)都继承自int,因此方法object(以及ToStringGetType)可供他们使用。

答案 2 :(得分:2)

在Java中,对于基本类型(intdouble等),您无法编写.toString(),因为类型不是对象。这意味着您可以选择编写类似

的选项
x + "";

或使用

Integer.toString(x);

在C ++中,你不能使用x + ""来进行这种转换,因为这将被视为指针算术并且会给你一个错误的指针。使用boost::lexical_cast之类的内容是进行转换的首选方式。

而且......我对C#一无所知,所以我不会评论它。 : - )

答案 3 :(得分:0)

使用x+""没有任何优点或缺点。 toStringObject类型的方法,每次将任何对象添加到字符串时都会隐式调用它。

如果您愿意,可以在课堂上覆盖此方法。

答案 4 :(得分:0)

因为字符串是不可变的,x+""调用两个函数:x.toString()和StringBuffer.append()(至少在Java中)。我想大多数优秀的JIT只会将其转换为单个函数调用x.toString(),但是如果没有实际测试我就无法确定。

答案 5 :(得分:0)

真的没关系。这不太可能导致任何性能问题。所以它仍然是个人风格的问题。 使用您或您的团队所熟悉的任何内容。

答案 6 :(得分:0)

在Java中,

除了使用原始类型之外,x+""也适用于null。如果x.toString()引发NullPointerException,则x+""会返回"null"。是否更好取决于你,但这是有区别的。

答案 7 :(得分:0)

在C#中,我会完全忽略这个建议,而是支持更具说明性的内容,例如直接使用.ToString

此语法为您提供的唯一潜在优势是,如果xnull,它将创建一个空字符串。如果这被认为是代码中的优势,我倾向于使用扩展方法。

public static string NullSafeToString<T>(this T value) where T : class {
  return value == null ? "" : value.ToString();
}

避免这种情况的另一个原因是它可能造成优先混淆。例如,如果不使用参考材料,您是否确切知道z在以下场景中的价值是什么?

int x = 42;
int y = 15;
string z = x + y + "";

现在同样的问题与以下

int x = 42;
int y = 15;
string z = x + y.ToString();

后者更有可能被没有花时间记忆C#运算符优先级的普通开发人员一目了然。因此我更喜欢它,因为它被误解的可能性较小。