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