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();