我想知道字符串的返回值在C#中是如何工作的。在我的一个函数中,我生成html代码,字符串非常大,然后我从函数中返回它,然后将它插入到页面中。但是我想知道我应该传递一个巨大的字符串作为返回值,还是只是将它从同一个函数插入到页面中?
当C#返回一个字符串时,它会从旧的字符串创建一个新的字符串,然后返回那个字符串吗?
谢谢。
发布于 2013-07-15 14:31:17
从函数返回时,不复制字符串(或任何其他引用类型),仅复制值类型。
发布于 2013-07-15 14:34:36
System.String
是一个引用类型(类),因此作为参数传递和返回只涉及引用(32或64位)的复制。
字符串的大小与此无关。
发布于 2013-07-15 15:00:51
返回一个字符串是一个廉价的操作-正如前面提到的,它纯粹是返回32或64位(4或8字节)的问题。
然而,正如Sten Petrov指出的那样,string +操作涉及到创建一个新的string,并且可能会有一点开销。如果你想节省性能和内存,我建议这样做:
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 )。
当然,我怀疑你在实践中是否真的需要这样做-如果你这样做了,我会花一些时间学习池化等,以帮助减少所有字符串构建器产生的垃圾-也许可以考虑创建一个更适合你的目的的自定义“字符串容器”。
https://stackoverflow.com/questions/17656700
复制相似问题