4

文字列の戻り値が C# の文字列に対してどのように機能するかを知りたいです。私の関数の 1 つで、html コードを生成しましたが、文字列が非常に大きいため、関数からそれを返し、ページに挿入します。しかし、巨大な文字列を戻り値として渡す必要があるのか​​ 、それとも同じ関数からページに挿入するだけなのか知りたいですか?

C# が文字列を返すとき、古い文字列から新しい文字列を作成し、それを返しますか?

ありがとう。

4

3 に答える 3

21

関数から戻るとき、文字列 (またはその他の参照型) はコピーされず、値型のみがコピーされます。

于 2013-07-15T14:31:17.427 に答える
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 に答える