文字列の戻り値が C# の文字列に対してどのように機能するかを知りたいです。私の関数の 1 つで、html コードを生成しましたが、文字列が非常に大きいため、関数からそれを返し、ページに挿入します。しかし、巨大な文字列を戻り値として渡す必要があるのか 、それとも同じ関数からページに挿入するだけなのか知りたいですか?
C# が文字列を返すとき、古い文字列から新しい文字列を作成し、それを返しますか?
ありがとう。
関数から戻るとき、文字列 (またはその他の参照型) はコピーされず、値型のみがコピーされます。
文字列を返すことは安価な操作です。前述のように、純粋に 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 が重い)。
もちろん、実際にこれが必要になるとは思えません。もしそうなら、すべての文字列ビルダーによって作成されるガベージを減らすために、プーリングなどについて学ぶことに時間を費やしたいと思います。用途に合わせた「ストリングホルダー」。