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

What is the use of the return value of the StringBuilder Append(string...) function?

StringBuilder 的 Append(string s) 函数(和类似函数)的完整语法是

StringBuilder myStringBuilder.Append(string myString)

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

根据 msdn,它不是 return 一个新的 StringBuilder 实例,而是对当前构建器本身的引用(即 myStringBuilder)。 我只是想不出使用 return 值完全有意义的场景,为什么他们不将 return 类型设为 void

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

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

... 而不是使用多个单独的语句:

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

它是单个表达式这一事实意味着您也可以在限制为单个表达式的地方使用它,例如字段初始化或 return 语句。后者意味着您也可以将它用于表达式体成员:

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

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

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

它有其优点和缺点,但正如 Jon Skeet 已经指出的那样,不仅 StringBuilder,而且在许多其他 类 和框架中,能够流畅地配置或执行东西是很有意思。

也许OP没见过list.Where(x => ...).OrderBy(x => ...).Select(x => ...).ToList()。还是温莎城堡的流畅配置API:Component.For<X>().ImplementedBy<Y>().LifeStyleSingleton().

这就是为什么 StringBuilder returns 从中调用 Append 的实例:能够调用其他方法 作为链 , 有时, 似乎比许多单独的句子更容易理解。

关于缺点

@Jason 在评论中问我缺点:

Matias, What are the cons?

根据我自己的经验,我相信很少有 缺点,但最重要的缺点之一可能是流畅的链 可能更难调试,因为您不能在交互式调试会话期间逐步进行(实际上您可以进入和退出...但它不如逐步进行舒服... ).

除了 con 我发现流畅的设计是实现自动文档化代码的好方法,因为有时它就像阅读自然语言的句子并使事情变得简单(对于那些已经习惯了流畅设计的人...)