C# string.Concat,可变还是不可变?

C# string.Concat,可变还是不可变?,c#,C#,我知道字符串在C中是不可变的,除非使用StringBuilder类。情况是,我有一个ObjectResultwhich实现了字符串的IEnumerable,我想把它转换成一个字符串对象。这里有两个选项: 使用string.Concat var myDesiredData = string.Concat(TheObjectResult) 使用StringBuilder var sb = new StringBuiler(); foreach (var item in TheObjectResul

我知道字符串在C中是不可变的,除非使用StringBuilder类。情况是,我有一个ObjectResultwhich实现了字符串的IEnumerable,我想把它转换成一个字符串对象。这里有两个选项:

使用string.Concat

var myDesiredData = string.Concat(TheObjectResult)
使用StringBuilder

var sb = new StringBuiler();
foreach (var item in TheObjectResult)
{
  sb.Append(item);
}
var myDesiredData = sb.ToString();

我不确定第一个选项是如何工作的。

两个选项几乎相同。以下是string.ConcatIEnumerable的实现方式:

[ComVisible(false)]
public static String Concat(IEnumerable<String> values) {
    if (values == null)
        throw new ArgumentNullException("values");
    Contract.Ensures(Contract.Result<String>() != null);
    Contract.EndContractBlock();

    StringBuilder result = StringBuilderCache.Acquire();
    using(IEnumerator<String> en = values.GetEnumerator()) {
        while (en.MoveNext()) {
            if (en.Current != null) {
                result.Append(en.Current);
            }
        }            
    }
    return StringBuilderCache.GetStringAndRelease(result);            
}

我会选择string.Concat,因为为什么要编写一个已经存在的方法。

这两个选项几乎相同。以下是string.ConcatIEnumerable的实现方式:

[ComVisible(false)]
public static String Concat(IEnumerable<String> values) {
    if (values == null)
        throw new ArgumentNullException("values");
    Contract.Ensures(Contract.Result<String>() != null);
    Contract.EndContractBlock();

    StringBuilder result = StringBuilderCache.Acquire();
    using(IEnumerator<String> en = values.GetEnumerator()) {
        while (en.MoveNext()) {
            if (en.Current != null) {
                result.Append(en.Current);
            }
        }            
    }
    return StringBuilderCache.GetStringAndRelease(result);            
}

我将使用string.Concat,因为为什么要编写一个已经存在的方法。

还有一个参考/示例。对于比字符串列表更复杂的对象,您需要覆盖ToString,这里还有一个参考/示例。对于比字符串列表更复杂的对象,需要重写ToString