【问题标题】:What is the use of the return value of the StringBuilder Append(string...) function?StringBuilder Append(string...) 函数的返回值有什么用?
【发布时间】:2016-02-15 10:02:40
【问题描述】:

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

StringBuilder myStringBuilder.Append(string myString)

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

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

【问题讨论】:

  • 你可能看过很多使用例子,但没有认出来

标签: c# stringbuilder


【解决方案1】:

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

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 是前进的方向......)

【讨论】:

  • 我多么愚蠢……我自己已经使用过这样的 StringBuilder 数百次了。关于 string.Format:我读到 StringBuilder、string.Format 和使用“+”连接字符串的性能增益取决于您要连接的字符串数量...
  • @sth_Weird:是的,但我通常会考虑可读性而不是性能,除非我知道它对性能至关重要。
【解决方案2】:

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

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

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

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

关于缺点

@Jason 在一些评论中询问了我的缺点:

Matias,有什么缺点?

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

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

【讨论】:

  • 我不会称其为流畅的 API 设计,因为一种方法无法制作流畅的界面!
  • @IanRingrose 好吧,一旦你可以从链中第一个方法返回的实例中调用一个方法......它似乎很流畅,不是吗? :\
  • Matias,有什么缺点?
  • 这种设计的另一个问题是,它可能使方法在更改后返回指向原始对象的指针,还是返回原始对象的更改副本变得不太清楚。跨度>
  • @supercat 是的,你是对的。我会将其添加到答案中,但我觉得我的答案最终与此问答无关...... :(
猜你喜欢
  • 2018-07-15
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多