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

sth*_*ird 27 c# stringbuilder

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

StringBuilder myStringBuilder.Append(string myString)
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 52

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

sb.Append("Foo=").Append(foo).Append("&Bar=").Append(bar);
Run Code Online (Sandbox Code Playgroud)

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

sb.Append("Foo=");
sb.Append(foo);
sb.Append("&Bar=");
sb.Append(bar);
Run Code Online (Sandbox Code Playgroud)

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

public override string ToString() =>
    new StringBuilder("x").Append(...).Append(...).ToString();
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*zer 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我觉得流利的设计,因为实现自动记录代码的一个很好的方式,有时它就像读一自然语言句子,让事情变得简单(那些已经得到用流利的设计中......)

  • 这种设计的另一个问题是它可以使得在更改它之后方法是否返回指向原始对象的指针,或者它是否返回原始对象的更改副本时不太清楚. (2认同)