C# x.toString()和x+&引用&引用;
回到大学,我的一个教授。教我们只做C# x.toString()和x+&引用&引用;,c#,java,C#,Java,回到大学,我的一个教授。教我们只做x+”作为从基本类型到字符串的快速转换。 我不记得我在哪些课程中有他使用过一些java和C++课程(我现在还没有使用过),但是我现在在C/.net中使用它,这是我最近主要开发的。 对于int、decimal、float等基本类型,使用.toString()是否比使用+“”更有优势。。。? 什么情况下.toString()会更好 注意:我也看到了.toString(),教授刚刚推荐了+”,因为它比较短,从那时起我就毫不怀疑地这样做了。在Java中,对于基本类型(i
x+”
作为从基本类型到字符串的快速转换。我不记得我在哪些课程中有他使用过一些java和C++课程(我现在还没有使用过),但是我现在在C/.net中使用它,这是我最近主要开发的。 对于int、decimal、float等基本类型,使用
.toString()
是否比使用+“”
更有优势。。。?
什么情况下.toString()
会更好
注意:我也看到了
.toString()
,教授刚刚推荐了+”
,因为它比较短,从那时起我就毫不怀疑地这样做了。在Java中,对于基本类型(int
,double
,等等),您不能编写.toString()
,因为类型不是对象。这意味着您可以选择编写以下内容
x + "";
或使用
Integer.toString(x);
在C++中,你不能使用<代码> x+”进行这种转换,因为这将被当作指针算术,并会给你一个坏指针。使用类似于boost::lexical_cast
的方法是进行转换的首选方法
而且。。。我对C#一无所知,所以我不会对此发表评论。:-) 使用
x+“”
没有任何优点或缺点toString
是Object
类型的方法,每次向字符串添加任何对象时都隐式调用该方法
如果愿意,您可以随时在类中重写此方法。因为字符串是不可变的,
x+“”
调用两个函数:x.toString()和StringBuffer.append()(至少在Java中)。我想大多数好的JIT都会简单地将其转换为单个函数调用x.toString(),但如果不进行实际测试,我就无法确定了。好吧,顺便说一句,这取决于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
结果是:
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的字符串值,而使用x+''有点像黑客,它说--我希望x的字符串值与''连接
旁注:
我不能谈论C#将发出的中间字节码,但我想象类似的情况。另外,对于C,你可以直接调用你的值类型,就像引用类型一样容易,所以我认为我的建议也会同样适用。
老实说,我认为这是一个奇怪的建议。 我不能谈论每一个具体的情况,但一般来说,
x+
在C#中会做什么(这应该取决于x
或string
类型的重载+
操作符的存在)是调用类似string.Concat(x,”)的东西
这反过来会调用x.ToString
在典型情况下,这只意味着x+“”
比x.ToString
多了一个方法调用的开销。当x
是某种值类型的变量时,这也会导致x
的值被装箱,除非+
的重载专门针对x
的类型存在(这可能被认为是一个无用的观点,因为如果x
的类型没有覆盖该方法,那么调用ToString
时也会将其装箱;这让我觉得有点罕见,但它确实发生了)
当然,这两种方法的区别很小。这两种方法的真正区别在于可读性;根据我的经验,x+“”
在.NET中不是很惯用,因此我倾向于避免使用它。也就是说,它可能在我居住的.NET世界中并不常见,而可能有很多.NET开发人员使用它
我要指出的是,在Java中,可能必须为
int
等基本类型的变量x
编写笨拙的Integer.toString(x)
,在C#和.NET中,通常所有类型(包括所谓的“基本”类型)都继承自对象,因此方法toString
(还有GetType
和GetHashCode
)对他们来说都是可用的。这真的不重要。这不太可能会导致任何性能问题。因此这仍然是个人风格的问题。
使用您或您的团队喜欢的任何工具。在Java中
除了处理基元类型外,x+“”
还处理null
。其中x.toString()
抛出NullPointerException
,x+“”
返回“null”
。这是否更好取决于您,但这是一个区别。在C中,我完全不考虑这个建议,而是选择更具声明性的方法,比如直接使用.ToString
此语法提供的唯一潜在优势是,如果x
为null
,它将创建一个空字符串。如果这被认为是代码中的优势,我倾向于使用扩展方法
public static string NullSafeToString<T>(this T value) where T : class {
return value == null ? "" : value.ToString();
}
下面是同样的问题
int x = 42;
int y = 15;
string z = x + y.ToString();
后者更容易被一个普通的开发人员所理解,而不是花费时间来存储C++操作符优先级。因此我更喜欢它,因为它有更少的被误解的机会。
有时我很感激教授不在公共部门写真实代码。与C++完全无关,我几乎总是使用<代码>“+STR ”。
int x = 42;
int y = 15;
string z = x + y + "";
int x = 42;
int y = 15;
string z = x + y.ToString();