StringBuilder是否仅在循环场景中首选?

Kar*_*son 3 c# stringbuilder

我理解这StringBuilder是在循环中连接字符串的选择,如下所示:

List<string> myListOfString = GetStringsFromDatabase();
var theStringBuilder = new StringBuilder();

foreach(string myString in myListOfString)
{
    theStringBuilder.Append(myString);
}

var result = theStringBuilder.ToString();
Run Code Online (Sandbox Code Playgroud)

但是哪些场景StringBuilder表现优异String.Join(),反之亦然?

var theStringBuilder = new StringBuilder();
theStringBuilder.Append("Is this ");
theStringBuilder.Append("ever a good ");
theStringBuilder.Append("idea?");

var result = theStringBuilder.ToString();
Run Code Online (Sandbox Code Playgroud)

要么

string result = String.Join(" ", new String[]
            {
                "Or", "is", "this", "a", "better", "solution", "?"
            });
Run Code Online (Sandbox Code Playgroud)

任何指导将不胜感激.

编辑:是否有一个阈值,其中的创建开销StringBuilder是不值得的?

cuo*_*gle 5

它似乎在代码(Reflector)的引擎盖下string.Join使用StringBuilder:

public static string Join(string separator, IEnumerable<string> values)
{
    using (IEnumerator<string> enumerator = values.GetEnumerator())
    {
        if (!enumerator.MoveNext())
        {
            return Empty;
        }
        StringBuilder sb = StringBuilderCache.Acquire(0x10);
        if (enumerator.Current != null)
        {
            sb.Append(enumerator.Current);
        }
        while (enumerator.MoveNext())
        {
            sb.Append(separator);
            if (enumerator.Current != null)
            {
                sb.Append(enumerator.Current);
            }
        }
        return StringBuilderCache.GetStringAndRelease(sb);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以在你的场景中,它并没有多大差别.但我更喜欢StringBuilder在尝试根据条件连接字符串时使用.