2011-05-07 91 views
6

我很好奇C#中的ToString()方法。举个例子如下:c#toString()性能

object height = 10; 

string heightStr = height.ToString(); 

当我打电话ToString()height,我得到一个字符串类型回来。运行时是否为该字符串分配内存?

+2

的ToString()是对人类,香水,是因为他们不读那么快一个非问题。无论如何。 – 2011-05-07 12:16:32

回答

4

是的。创建一个类的新实例(就像在这种情况下正在使用字符串类一样)将为实例分配内存。

+1

我不太确定字符串是不可变的这个事实在这里是相关的。他没有修改'String'类的现有实例,而是将'ToString'函数的结果赋值给一个类型为'string'的变量。即使它*不是不可变的,它将创建类的新实例。 – 2011-05-07 09:37:02

+0

@Cody我提到它强调了所有字符串实例都分配了一个新的内存地址的事实。你是对的,它并不高度相关,但我认为它可能会带来一些额外的清晰度。无论如何,我已经删除了提到不变性以避免混淆。 – 2011-05-07 09:39:15

5

是的,运行时将为您创建或请求的任何字符串对象(包括从方法调用返回的字符串对象)分配内存。

但是不,这绝对是而不是你必须担心的事情。它不会对你的应用程序的性能产生明显的影响,你不应该屈服于过早优化代码的诱惑。

Int32.ToString方法非常快。它调用CLR级别编写的本地代码,这可能不会成为任何应用程序中的性能瓶颈。


事实上,这里的真正性能问题将是boxing,这是将一个值类型为类型object,然后再返回的过程。这将发生是因为您声明height变量为object,然后为其分配一个整数值。

这是一个更好的主意,显式声明heightint类型,就像这样:

int height = 10; 
string heightStr = height.ToString(); 
+0

一套装箱/拆箱并不比分配一个字符串更低效。 – 2011-05-07 09:43:55

+0

@Matti:不,一套可能不是。我必须看到性能数据是可以肯定的,但在这里并不重要。我试图做的区别是拳击是值得一般避免的东西。在编写.NET代码时,它被认为是“不好的做法”,这当然是每个人都需要知道的东西。字符串分配不是问题,也不是要避免的。重复的装箱/拆箱操作在应用程序中导致性能问题的可能性更大。 – 2011-05-07 09:46:07

+0

作为一个小提示:如果你在一个值类型的变量/表达式上调用一个虚拟的方法(比如ToString()),那么**不会显式地覆盖它。在'int'的情况下,*有一个显式的int.ToString(),但事实并非总是如此。 – 2011-05-07 10:28:49