回到大学,我的一个教授。我们只是将x + ""
作为从基本类型到字符串的快速转换
我不记得是什么课程,因为我有一些Java和C ++课程(我现在还没有使用过一段时间),但我现在在C#/ .Net中使用它,这就是我主要开发的内容在最近。
使用.toString()
优于+""
对于int,decimal,float等基本类型是否有优势?
.toString()
哪种情况会更好?
注意:我也看到了.toString()
,教授刚才推荐+""
,因为它更短,我从那时起就完成了这项工作而没有质疑。
答案 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.ToString
比x + ""
有更多方法调用的开销。但是,当x.ToString
是某个值类型的变量时,这也会导致x
的值被加框,除非x
的重载专门针对{{1}的类型而存在(这可能被认为是无用的点,因为如果+
的类型没有覆盖该方法,x
将也在x
的调用中加框;这让我感到震惊aa 位稀少,但最确定的确发生了。)
当然,这些是相当微不足道的差异。这两种方法之间的真正的区别在于可读性;根据我的经验,ToString
在.NET中不是很惯用,所以我倾向于避免它。也就是说,它可能只是在我所居住的.NET世界中并不常见,而可能有很多.NET开发人员在那里做这件事。
我将指出,在Java中,也许您必须在C#中为x + ""
等原始类型的变量Integer.toString(x)
编写笨拙的x
在.NET中,所有类型(包括所谓的“原始”类型)都继承自int
,因此方法object
(以及ToString
和GetType
)可供他们使用。
答案 2 :(得分:2)
在Java中,对于基本类型(int
,double
等),您无法编写.toString()
,因为类型不是对象。这意味着您可以选择编写类似
x + "";
或使用
Integer.toString(x);
在C ++中,你不能使用x + ""
来进行这种转换,因为这将被视为指针算术并且会给你一个错误的指针。使用boost::lexical_cast
之类的内容是进行转换的首选方式。
而且......我对C#一无所知,所以我不会评论它。 : - )
答案 3 :(得分:0)
使用x+""
没有任何优点或缺点。 toString
是Object
类型的方法,每次将任何对象添加到字符串时都会隐式调用它。
如果您愿意,可以在课堂上覆盖此方法。
答案 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
。
此语法为您提供的唯一潜在优势是,如果x
为null
,它将创建一个空字符串。如果这被认为是代码中的优势,我倾向于使用扩展方法。
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#运算符优先级的普通开发人员一目了然。因此我更喜欢它,因为它被误解的可能性较小。