StringBuilder Append(string ...)函数的返回值有什么用?

时间:2016-02-15 10:02:40

标签: c# stringbuilder

StringBuilder的附加(字符串s)函数(和类似函数)的完整语法是

StringBuilder myStringBuilder.Append(string myString)

因为myStringBuilder.Append(string myString)已经将字符串添加到myStringBuilder,我想知道返回值是什么? 我从未见过任何使用返回值的示例代码。

根据msdn,它不返回新的StringBuilder实例,而是返回对当前构建器本身的引用(即myStringBuilder)。 我根本无法想到使用返回值有意义的情况,为什么他们没有做出返回类型void

2 个答案:

答案 0 :(得分:52)

这意味着您可以轻松地将呼叫链接在一起:

sb.Append("Foo=").Append(foo).Append("&Bar=").Append(bar);

...而不是使用几个单独的陈述:

sb.Append("Foo=");
sb.Append(foo);
sb.Append("&Bar=");
sb.Append(bar);

它是单个表达式的事实意味着您也可以在限制为单个表达式的位置使用它,例如字段初始化或返回语句。后者意味着你也可以将它用于表达身体的成员:

public override string ToString() =>
    new StringBuilder("x").Append(...).Append(...).ToString();

(在许多情况下,使用string.Format或插值字符串文字会更有意义,但有时StringBuilder是前进之路......)

答案 1 :(得分:10)

为了给Jon Skeet的答案增加更多价值,值得一提的是,这是一个流畅的API设计

它有它的优点和缺点,但正如Jon Skeet已经指出的那样,不仅使用StringBuilder,而且在许多其他类和框架中,能够流利地配置或执行事物非常有趣。

也许OP从未见过list.Where(x => ...).OrderBy(x => ...).Select(x => ...).ToList()。或Castle Windsor的流畅配置API:Component.For<X>().ImplementedBy<Y>().LifeStyleSingleton()

这就是StringBuilder返回调用Append的实例的原因:能够将其他方法称为链,有时似乎更容易理解比许多单独的句子。

关于利弊

@Jason在一些评论中问我这个缺点:

  

Matias,有什么缺点?

根据我自己的经验,我认为很少有缺点,但最重要的一个可能是流畅的链可能更难以调试在交互式调试会话期间你不能一步一步地去(实际上你可以进入并退出......但是它不如一步一步...... )。

除了 con 我发现流畅的设计是实现自动记录代码的一种好方法,因为有时它就像阅读自然语言句子并保持简单(到那些已经有的与流畅的设计一起使用......