c#toString()性能

c#toString()性能,c#,.net,tostring,C#,.net,Tostring,我对C#中的ToString()方法很好奇。以以下为例: object height = 10; string heightStr = height.ToString(); 当我在height上调用ToString()时,我得到了一个字符串类型。运行时是否为此字符串分配内存?是。创建一个类的新实例(本例中使用string类)将为该实例分配内存。是的,运行时将为您创建或请求的任何string对象分配内存,包括从方法调用返回的对象 但不,这绝对不是你需要担心的事情。它不会对应用程序的性能产生任何

我对C#中的
ToString()
方法很好奇。以以下为例:

object height = 10;

string heightStr = height.ToString();

当我在
height
上调用
ToString()
时,我得到了一个字符串类型。运行时是否为此字符串分配内存?

是。创建一个类的新实例(本例中使用string类)将为该实例分配内存。

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

但不,这绝对不是你需要担心的事情。它不会对应用程序的性能产生任何明显的影响,并且您永远不应该屈服于过早优化代码的诱惑

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


事实上,这里真正的性能问题是,将值类型转换为类型
对象
再转换回来的过程。这是因为您将
高度
变量声明为类型
对象
,然后为其指定了一个整数值

最好将
height
显式声明为type
int
,如下所示:

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

我不确定字符串是不可变的这一事实在这里有什么关系。他没有修改
String
类的现有实例,而是将
ToString
函数的结果赋给类型为
String
的变量。这将创建一个新的类实例,即使它不是不可变的。@Cody我提到它是为了强调所有字符串实例都分配了一个新的内存地址。你是对的,它不是很相关,但我认为它可能会带来一些额外的清晰度。在任何情况下,为了避免混淆,我已经删除了对不变性的提及。一组装箱/取消装箱并不比分配字符串更低效。@Matti:不,一组可能不是。我必须查看性能数据才能确定,但这与此无关。我试图做出的区别是拳击是一种值得普遍避免的东西。在编写.NET代码时,这被认为是一种“不好的做法”,而且每个人都应该意识到这一点。字符串分配不是问题,也不是需要避免的问题。重复装箱/取消装箱操作在应用程序中造成性能问题的可能性更大。请注意:如果对未显式重写的值类型变量/表达式调用虚拟方法(如ToString()),也会发生装箱。在
int
的情况下,有一个显式的int.ToString(),但情况并非总是如此。Re“对于您创建或请求的任何字符串对象”,当然也有内部调用的问题,这里不适用,但“any”是一个大语句。我不得不不同意开头的语句。在某些情况下,这将是一个性能问题。如果这在一个紧密的循环中多次发生,那么分配的累积效应可能会导致昂贵的垃圾收集。在游戏中,垃圾收集非常明显。在一代收集器(如compact framework中的收集器)中,您还可能会面临碎片化的风险,这会给收集器带来更多的工作。ToString()适用于人类,性能不是问题,因为他们的读取速度没有那么快。反正应该是。