什么是InplaceStringBuilder和StringBuilder之间的区别?

Ron*_*n C 5 stringbuilder memory-management .net-core asp.net-core

今天在VS2017 intellisense浮出水面InplaceStringBuilder时,我试图打字StringBuilder. InplaceStringBuilder对我来说是新的,所以我开始挖掘,看看我能学到什么.

我注意到的第一件事是它是一个结构而不是一个类,它的类型信息如下所示:

#region Assembly Microsoft.Extensions.Primitives, Version=1.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// C:\Users\Ron Clabo\Documents\Visual Studio 2017\Projects\wwwGiftOasisResponsive\packages\Microsoft.Extensions.Primitives.1.1.0\lib\netstandard1.0\Microsoft.Extensions.Primitives.dll
#endregion

using System.Diagnostics;

namespace Microsoft.Extensions.Primitives {
    [DebuggerDisplay("Value = {_value}")]
    public struct InplaceStringBuilder {
        public InplaceStringBuilder(int capacity);

        public int Capacity { get; set; }

        public void Append(string s);
        public void Append(char c);
        public override string ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

所以它有很多方法比StringBuilder.然后我google了解更多信息,InplaceStringBuilder但网上关于它的内容并不多,所以它看起来很新.

此外,我已经提到的差异,InplaceStringBuilder和之间有什么不同StringBuilder; 什么时候开发人员应该使用新的InplaceStringBuilder而不是旧的StringBuilder

Sha*_*tin 5

由于它只进行一次分配,因此InplaceStringBuilder对于众所周知的、合理大小的字符串来说效率更高。我们可能希望在需要非常高效的方法中使用它。

它是通过Pull request #157引入的,其中包括以下评论。

旨在代替池化StringBuilderstring.Concat当字符串的所有部分都已知时使用...仅对结果字符串进行 1 次分配...仅应用于众所周知的合理大小的字符串。对于其他所有内容,请使用StringBuilder...不要跨等待点使用...

PR 的历史讲述了这样一个故事:

  1. 2016 年 7 月,第 676 期问题注意到不必要的分配。
  2. 2016 年 9 月,Pull request #699解决了问题 #676 并建议将“就地字符串格式化为结构体...”
  3. 2016 年 9 月,第 717 期问题正式确定了该提案。
  4. 2016 年 9 月,Pull request #157实施了该提案。


Tho*_*ler 3

当结果字符串比初始容量长时,法线StringBuilder会增加容量。其InplaceStringBuilder容量有限,如果生成的字符串较长,则会引发异常。

这是 的一个很大的限制InplaceStringBuilder,因此它可能只适用于极少数情况。此外,如果您提前知道容量,则已经可以定义普通StringBuilder.

来源:查看GitHubInplaceStringBuilder上的实现并与MSDN上进行比较StringBuilder