在Delphi中将UnicodeString附加到WideString

在Delphi中将UnicodeString附加到WideString,delphi,unicode-string,widestring,Delphi,Unicode String,Widestring,我很好奇Delphi 2010中的这段代码会发生什么: function foo: WideString; var myUnicodeString: UnicodeString; begin for i:=1 to 1000 do begin myUnicodeString := ... something ...; result := result + myUnicodeString; // This is where I'm interested e

我很好奇Delphi 2010中的这段代码会发生什么:

function foo: WideString;
var 
   myUnicodeString: UnicodeString; 
begin
  for i:=1 to 1000 do
  begin
    myUnicodeString := ... something ...;

    result := result + myUnicodeString;  // This is where I'm interested
  end;
end;
涉及多少个字符串转换,性能是否特别差


我知道函数应该只返回一个
UnicodeString
,但是我在VCL流代码中看到了这种反模式,我想了解这个过程。

性能很差。不需要任何编码转换,因为所有内容都是UTF-16编码的。但是,WideString是COM BSTR类型的包装器,其性能比本机UnicodeString差

当然,您应该更愿意使用本机类型(UnicodeString或TStringBuilder)完成所有工作,并在最后一刻转换为WideString


这通常是一项好政策。您不希望在内部使用WideString,因为它纯粹是一种互操作类型。因此,仅在互操作边界处转换为(和从)WideString。

要回答您关于代码实际执行操作的问题,请执行以下语句:

result := result + myUnicodeString;
是否有下列情况:

  • 调用
    System.\u ustromWSTR()
    以将
    结果
    转换为临时
    UnicodeString

  • 调用
    System.\u UStrCat()
    myUnicodeString
    连接到临时

  • 调用
    System.\u WStrFromUStr()
    将温度转换为
    WideString
    并将其分配回
    结果


  • 有一个
    系统。_WStrCat()
    函数,用于将
    宽字符串
    连接到
    宽字符串
    (和
    系统。_UStrCat()
    用于
    单链分解
    )。如果CodeGear/Embarcadero在这方面做得更聪明,他们就可以实现一个
    系统。_WStrCat()
    重载,它将
    UnicodeString
    作为输入,将
    WideString
    作为输出(反之亦然,将
    WideString
    连接到
    UnicodeString
    )。这样,就不再需要进行temp
    UnicodeString
    转换。
    WideString
    UnicodeString
    都被编码为UTF-16(大多数情况下,我不会在这里详细介绍),因此将它们连接在一起只需一次分配和移动,就像在连接两个<代码> UnoDeSoSc>/Cux>s或两个<代码>广谱s。

    你是否尝试在调试器的CPU窗口中查找?@ OnTeF飞:它实际上是C++ Builder项目的一部分,并且出于某些原因,BCB2010不喜欢在VCL代码中设置断点…如果你没有Delphi来研究生成的tescase代码,我可以发布一个反汇编,但我真的不确定如何以有用的形式呈现它…@Roddy:检查链接器选项以使用debug DCU。(项目->选项->Delphi编译器->使用调试DCU)。这将允许您从Builder进入Delphi VCL和RTL。谢谢。我特别好奇字符串concat(wide:=wide+uni)是发生在unicode还是广域中。如果是unicode,则涉及两种转换。(宽->统一,康卡特,统一->宽)我不知道我头顶上的具体细节。但是,使用调试器进行调试非常容易。一些我现在没有的东西。不管怎样,你都不想要。使用TStringBuilder完成所有工作,并尽可能晚地转换为WideString。即使使用纯本机字符串,所有这些连接都是不好的。堆得很重。实际上这不是我的代码。它在D2010中的classes.pas中(组合销毁)。我遇到了一个问题,当使用文本DFMs时,一个只有4MB字符串属性的表单(是的,但这是一个很好的理由!)需要2.5分钟(!)才能加载,而使用二进制文件则需要不到一秒钟的时间。那时你就无能为力了。你知道表演是垃圾。不要把字符串放在dfm文件中。@Roddy我不这么认为。文本DFM设置仅适用于源代码。链接的可执行文件始终具有二进制DFM。谢谢Remy。这解释了很多!