4

我想知道字符串的返回值如何适用于 C# 中的字符串。在我的一个函数中,我生成了 html 代码并且字符串非常大,然后我从函数中返回它,然后将它插入到页面中。但我想知道我应该将一个巨大的字符串作为返回值传递,还是只是将它从同一个函数插入到页面中?

当 C# 返回一个字符串时,它是否会从旧字符串创建一个新字符串并返回它?

谢谢。

4

3 回答 3

21

从函数返回时不会复制字符串(或任何其他引用类型),只有值类型会复制。

于 2013-07-15T14:31:17.427 回答
8

System.String是引用类型(类),因此作为参数传递并返回仅涉及引用的复制(32 位或 64 位)。

字符串的大小无关紧要。

于 2013-07-15T14:34:35.747 回答
1

返回一个字符串是一种廉价的操作——如前所述,它纯粹是返回 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 很重)。

当然,我怀疑您实际上是否会在实践中看到对此的任何需求-如果您这样做,我会花一些时间学习池等,以帮助减少所有字符串构建器产生的垃圾-也许考虑创建一个自定义更适合您的目的的“绳架”。

于 2013-07-15T15:00:51.250 回答