C# StringBuilder Append(string…)函数的返回值有什么用途?
StringBuilder的追加(字符串s)函数(以及类似函数)的完整语法如下 由于C# StringBuilder Append(string…)函数的返回值有什么用途?,c#,stringbuilder,C#,Stringbuilder,StringBuilder的追加(字符串s)函数(以及类似函数)的完整语法如下 由于myStringBuilder.Append(string myString)已经将字符串添加到myStringBuilder,我想知道返回值的用途是什么? 我从未见过任何使用返回值的示例代码 根据msdn,它不会返回新的StringBuilder实例,而是返回对当前生成器本身的引用(即myStringBuilder)。 我想不出使用返回值有什么意义,为什么他们不将返回类型设置为void?这意味着可以轻松地将调用
myStringBuilder.Append(string myString)
已经将字符串添加到myStringBuilder
,我想知道返回值的用途是什么?
我从未见过任何使用返回值的示例代码
根据msdn,它不会返回新的StringBuilder
实例,而是返回对当前生成器本身的引用(即myStringBuilder
)。
我想不出使用返回值有什么意义,为什么他们不将返回类型设置为void?这意味着可以轻松地将调用链接在一起:
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
是前进的方向……为了给Jon Skeet的答案增加更多价值,值得一提的是,这是一个流畅的API设计
它有其优点和缺点,但正如Jon Skeet所指出的,不仅在StringBuilder中,而且在许多其他类和框架中,能够流畅地配置或执行东西是非常有趣的
可能OP从未见过list.Where(x=>…).OrderBy(x=>…).Select(x=>…).ToList()
。或者Castle Windsor的fluent配置API:组件.For().ImplementedBy().Lifestyle Singleton()
这就是为什么StringBuilder
返回调用Append
的实例:能够作为一个链调用其他方法,这有时似乎比许多单独的句子更容易理解
关于犯人
@Jason问我一些评论中的缺点:
马蒂亚斯,缺点是什么
从我自己的经验来看,我认为有几个缺点,但最重要的一个可能是,流畅的链可能更难调试,因为在交互式调试会话中,您不能一步一步地进行调试(实际上,您可以一步一步地进行调试…但这比一步一步地进行调试更不舒服…)
除了con之外,我发现fluent design是实现自动文档化代码的一种很好的方法,因为有时它就像阅读自然语言句子一样,并保持简单(对于那些已经使用fluent design的人来说…我不会将其称为fluent API设计,因为一种方法不能生成流畅的界面@IanRingrose好的,一旦您可以从链中第一个方法返回的实例调用方法。。。看起来很流利,不是吗\Matias,缺点是什么?这种设计的另一个问题是,它会使方法在更改后是否返回指向原始对象的指针,或者是否返回原始对象的更改副本变得不太清楚。@supercat是的,你是对的。我会将其添加到答案中,但我觉得我的答案最终与此问答无关(您可能已经看到了很多使用示例,但没有认识到它们。我真是太蠢了……我自己已经像这样使用StringBuilder数百次了。Abount string.Format:我读到StringBuilder、string.Format和使用“+”连接字符串的性能增益根据你想要加入的字符串数量的不同而有所不同…@sth\u怪异:是的,但我通常会选择可读性而不是性能,除非我知道这是性能关键。
public override string ToString() =>
new StringBuilder("x").Append(...).Append(...).ToString();