[英]How slow is passing large strings as return values in C#?
我想知道字符串的返回值如何适用于C#中的字符串。 在我的一个函数中,我生成了html代码,字符串非常庞大,然后我从函数中返回它,然后将其插入到页面中。 但我想知道我应该将一个巨大的字符串作为返回值传递,还是只是将它从同一个函数插入到页面中?
当C#返回一个字符串时,是否从旧字符串创建一个新字符串,并返回该字符串?
谢谢。
从函数返回时不会复制字符串(或任何其他引用类型),只有值类型。
System.String
是一个引用类型(类),因此作为参数传递并返回仅涉及复制引用(32或64位)。
字符串的大小无关紧要。
返回字符串是一种廉价的操作 - 如上所述,它纯粹是返回32或64位(4或8字节)的问题。
然而,正如Sten Petrov指出字符串+操作涉及创建一个新字符串,并且可能有点贵。 如果你想保存性能和内存,我建议做这样的事情:
static int i = 0;
static void Main(string[] args)
{
while (Console.ReadLine() == "")
{
var pageSB = new StringBuilder();
foreach (var section in new[] { AddHeader(), AddContent(), AddFooter() })
for (int i = 0; i < section.Length; i++)
pageSB.Append(section[i]);
Console.Write(pageSB.ToString());
}
}
static StringBuilder AddHeader()
{
return new StringBuilder().Append("Hi ").AppendLine("World");
}
static StringBuilder AddContent()
{
return new StringBuilder()
.AppendFormat("This page has been viewed: {0} times\n", ++i);
}
static StringBuilder AddFooter()
{
return new StringBuilder().Append("Bye ").AppendLine("World");
}
这里我们使用StringBuilders来保存对我们想要连接的所有字符串的引用,并等到最后才将它们连接在一起。 这将节省许多不必要的添加(相比之下,内存和CPU很重)。
当然,我怀疑你实际上是否会在实践中看到任何需要 - 如果你这样做,我会花一些时间学习池化等,以帮助减少所有字符串构建者创建的垃圾 - 并且可能考虑创建一个自定义'字符串持有者'更适合您的目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.