如果 StringBuilder 是可变的,为什么 StringBuilder 方法会返回一个 StringBuilder 对象?

12

我们都知道字符串是不可变的,而StringBuilder是可变的。 对的。那么为什么它的方法返回一个StringBuilder对象?它们不应该都是void方法吗?

为什么这样?

public StringBuilder Append(bool value)
而不是
public void Append(bool value)

有关如何使用它的任何示例都将是很好的。

2个回答

21
这被称为"流畅接口"。它允许您通过重复的点符号将调用链接在一起。
return new StringBuilder()
  .Append("Hello, ")
  .Append("world!")
  .ToString();

使用 dotPeek 查看 StringBuilder 类,您将看到 1500 多行代码,毫无疑问地展示了它是什么以及如何实现。 - Mr. Mr.
1
维基页面的C#部分下有一个示例! - CSharpened
好的,但是当评论被发表时,代码片段是由Dennis添加的。为什么我的回答被挑选出来而不是下面的另一个回答? - duffymo
1
@Monkieboy:当你已经无法从函数签名中推断出设计意图时,阅读1500行源代码如何澄清设计意图? - oɔɯǝɹ
我不满意的不是编辑。我同意这样做更好。我并不总是有时间去专注于每一个答案,所以我尽力贡献自己的一份力量。如果有人稍后来改进它,我没有任何问题。让我感到困扰的是那些除了自命不凡的主持人评论之外没有做出任何贡献的人的评论。 - duffymo
@omer - 我实际上是在回应请求提供示例,而有什么比代码本身更好的示例呢?但在这种情况下,代码太长了,无法在此粘贴,这就是为什么我建议查看反编译源代码。此外,一个方法应该揭示设计意图和功能意图...我个人认为,在许多情况下,这将是一项艰巨的任务。 - Mr. Mr.

15

来自MSDN:

大多数修改此类实例的方法都返回对该实例的引用。由于返回了对实例的引用,因此您可以在引用上调用方法或属性。如果要编写单个语句以连续执行一系列操作,则这可能很方便。

示例:

string user = new StringBuilder()
    .AppendFormat("Name: {0}", user.Name)
    .AppendLine()
    .AppendFormat("Email: {0}", user.Email)
    .AppendLine()
    .ToString();

这通常被称为流畅接口


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接