Delphi中存在类似Java或C#StringBuilder的东西吗?或者Delphi不需要StringBuilder并且s := s + 'some string';是良好的表达式(主要用于for,while循环).
ulr*_*chb 41
是的,Delphi提供TStringBuilder(自2009年起):
procedure TestStringBuilder;
var
  I: Integer;
  StringBuilder: TStringBuilder;
begin
  StringBuilder := TStringBuilder.Create;
  try
    for I := 1 to 10 do
    begin
      StringBuilder.Append('a string ');
      StringBuilder.Append(66); //add an integer
      StringBuilder.Append(sLineBreak); //add new line
    end;
    OutputWriteLine('Final string builder length: ' +
                    IntToStr(StringBuilder.Length));
  finally
    StringBuilder.Free;
  end;
end;
是的,你是对的.s := s + 'text';并不比使用TStringBuilder慢.
在较旧的Delphis中,您可以使用Hallvard Vassbotn的HVStringBuilder.我没能找到他的博客的来源,但你可以在获取它们OmniThreadLibrary源代码树,比如(你需要的文件HVStringBuilder.pas和HVStringData.pas).
Delphi不会“ 要求 ”一个字符串生成器类,但是如果您愿意使用它,可以为Delphi 2009提供一个。您的s:= s +'some string'示例;这是一种典型的字符串填充方法,过去几十年来一直在Pascal / Delphi中使用,而没有任何重大问题。
小智 5
提到的TStringBuilder就是可行的方法。在您的具体情况下,串联可能没问题,但无论如何我总是会尝试替代方案。
我正在内存中创建一个 EPUB 正文内容 xhtml 文件(Delphi XE),但生成它花了很长时间,以至于我从来没有让它完成过(大约5 分钟多才放弃)。这是一个现实生活中的示例,包含大约 800,000 个字符的文本。采用完全相同的代码并直接用TStringBuilder.Append语句替换s:=s+''样式语句将其减少到大约3 秒。重申一下,除了不再使用串联之外,没有任何逻辑变化。
小智 5
我真的很惊讶,没有人在任何评论或示例中提到您可以指示 TStringBuilder 在实例化期间预先分配适合任务的缓冲区。换句话说,如果您可以对可能需要多少内存进行简单的估计,稍微填充一下,并使用该值来实例化 TStringBuilder ,您就可以避免内存重新分配,从而减慢简单字符串连接的速度:
buff := TStringBuilder.Create( tmpEstimatedSize );
我经常在新代码中使用 TStringBuilder 并优化旧代码,增量构建大型字符串时的 CPU 节省是巨大的。现在说实话,如果我只有少量字符串需要连接,我就不会使用 TStringBuilder。但是,如果我要序列化可能是大量数据的数据,那么 TStringBuilder 是显而易见的解决方案。